2014-08-27 171 views
53

我知道JavaScript有很多瘋狂的結果和類型之間的比較,但我不完全明白爲什麼。今天遇到這個。爲什麼JavaScript中的「」== [null]爲true?

爲什麼

"" == [null] 

評估在JavaScript true

一些更多的JavaScript平等娛樂,感謝@Qantas:

+10

與單個空元素的數組獲得的澆鑄爲字符串,這意味着它調用它。加入(「」),因爲它變成'(串)null',這是一個空的只有一個元素串。 – scragar 2014-08-27 15:41:07

+9

使用全等''===,如果要比較兩個不同的類型,將其轉換爲同一類型 – 2014-08-27 15:46:12

+2

相關:http://dorey.github.io/JavaScript-Equality-Table/ – MikeTheLiar 2014-08-27 17:11:14

回答

76

"Abstract Equality Comparison Algorithm"有很多地方,但這裏最重要的一個是這樣的:

如果Type(X)是String或數目和類型(Ÿ)爲對象, 返回結果的比較x == ToPrimitive(y)。

(有這方面的一個鏡像了。)所以,因爲""是一個字符串,[null]是一個對象,我們必須首先通過調用ToPrimitive([null])轉換[null]爲字符串。當要求將對象實例轉換爲原始值時,這是一個內部操作,如下所述:

返回對象的默認值。通過調用對象的[[DefaultValue]]內部方法來檢索對象的默認值,並傳遞可選提示PreferredType。本規範針對8.12.8中的所有本機ECMAScript對象定義[[DefaultValue]]內部方法的行爲。

現在,[[DefaultValue]]內部操作將在該對象上調用.toString()並返回該值。在您的瀏覽器控制檯中嘗試使用[null].toString()

> [null].toString() 
"" 

並且您擁有它。

編輯:爲什麼[null].toString()是一個空字符串?由於Array實例上的.toString()操作始終只調用.join(),並且總是會爲nullundefined值產生一個空字符串。因此,一個null的數組最終只是一個空字符串。

+1

我認爲你簡短一步;爲什麼不''[null] .toString()'返回''null「'? – Izkata 2014-08-27 18:25:11

+8

@Izkata Array.prototype.toString()返回數組上調用this.join()的結果,'.join()'將null和undefined條目渲染爲空字符串。因此,帶有一個「空」條目的數組呈現爲空字符串。 – Pointy 2014-08-27 18:31:17

+1

將整數轉換爲字符串或布爾值 '「」== 0'和'「」== false' – sulest 2014-08-27 19:24:34

12

爲什麼"" == [null]評價爲真?

因爲您將數組與字符串進行比較,所以使用non-strict equality operator == - 因此它會在比較之前嘗試將值轉換爲相同類型。

具體會發生什麼事是:

  1. 你比較一個字符串對象,所以對象轉換爲字符串:
  2. 當一個數組被強制轉換爲原始值,它的.toString()方法調用(如由其他的答案詳細解釋),它等效於調用.join()
  3. 這在只包含一個undefinednull值的一元件陣列的情況下returns the empty string
  4. 這最終等同於空字符串

這第三步是出乎意料的([null]+"" != null+""),如果它實際上沒有強制轉換爲字符串,結果將是"null"和你平等是假的。

17

這是根據Javascript的神祕type-conversion規則。規則8:

如果Type(x)是String或Number而Type(y)是Object,則返回比較結果x == ToPrimitive(y)。

所以該比較是x = ""y = [null]之間轉換爲使用ToPrimitive的字符串。使用一個空元素轉換數組會導致一個空字符串(因爲Array.toString()返回逗號分隔的值列表),因此它們的計算結果相等。

2

讓我們來看看在規格和貫徹每個步驟

通過Abstract Equality Comparison Algorithm (§11.9.3)狀況:

  1. typeof ""; // stringtypeof [null]; // object所以不適用
  2. 也不是nullundefined所以不適用
  3. 相同as 2
  4. 既不是數字,也不適用
  5. 同4
  6. 既不是一個布爾值,不適用
  7. 再次不適用
  8. 最後,適用的東西,現在我們需要知道ToPrimitive([null])

§9.1 ToPrimitive對象說我們需要制定出[[DefaultValue]] (§8.12.8),其中的第1點和第2點說如果你可以做.toString而且它給出了一個字符串,返回那個,所以

[null].toString(); // "" 

所以我們現在正執行比較"" == ""這是true抽象平等比較算法的點1 d。

如果Type(x)字符串,然後返回true如果xy是完全相同的字符(相同的長度和相同的字符在對應的位置)相同的序列。否則,返回false

1

JavaScript是弱類型的;您可以使用以下來獲得錯誤結果:

"" === [null] 
-1

null值是表示null或「空」值的JavaScript文字,即不存在對象值。它是JavaScript的原始值之一。

null的值是一個文字(不是像undefined這樣的全局對象的屬性)。在API中,通常在可以預期對象但沒有對象相關的位置檢索null。當檢查null或undefined時,要小心等號(==)和標識(===)運算符(類型轉換是用前者執行)之間的差異。

typeof null  // object (bug in ECMAScript, should be null) 
typeof undefined // undefined 
null === undefined // false 
null == undefined // true 
相關問題