2015-08-28 30 views
-3

任何想法爲什麼它的行爲如此?具有空元素的有趣數組JavaScript行爲

+0

'!!測試' – tymeJV

+1

用'=='比較數組與非數組幾乎沒有實際用途,除非您認爲這種娛樂或您喜歡在ECMAScript規範中研究類型轉換規則的複雜性。這是什麼意思? – jfriend00

+0

這已被問了幾次。尋找真相和虛假。 'if(非null,空字符串,0)'總是返回true。至於其他,看看test.toString()返回什麼,你會看到爲什麼[null] == false是true,[null,null] == false是false – mplungjan

回答

2

==用來比較不同類型的東西,像一個數組([null])和false,它有它通過具體步驟,稱爲Abstract Equality Algorithm(以下引用),試圖強迫他們的東西,它可以比較。 (因爲==是「鬆散的」相等操作。)

首先它看到如果操作數是nullundefined,但在這種情況下也不是。

然後看看它是否比較數字和字符串,但在這種情況下也不是這樣。

然後,看起來如果兩個操作數是布爾值,當然這些是。由於其中一個是布爾型的,因此它在規範中執行一個名爲ToNumber的抽象操作,將另一個轉換爲數字並執行另一個操作==。 (該Number功能,作爲一個功能,而不是一個構造函數中使用時,基本上是抽象ToNumber操作的包裝。)

所以

[null] == false 

成爲

0 == false 

...因爲ToNumber([null])將其參數強制轉換爲字符串(通過ToPrimitive),得到"",然後將其轉換爲0

所以現在==有一些操作數是一個數字。所以它將其他也轉換爲數字。 Number(false)0。因此,[null] == false是正確的。


那麼[null, null] == false呢?當將[null, null]轉換爲字符串時,我們得到",",其中ToNumber無法變成有效數字。所以它將它轉換爲NaNNaN有趣的事情之一是它是一個數字,但它永遠不會等於其他任何東西。所以:

[null, null] == false 

成爲

NaN == false 

成爲

NaN == 0 

...這是false,因爲(再次)NaN永遠無所不能。


以下是摘要平等算法:

  1. ReturnIfAbruptx)。
  2. ReturnIfAbrupty)。
  3. 如果Typex)是相同的類型(y),然後

    一個)返回執行嚴格相等比較x === y的結果。

  4. 如果xnullyundefined,返回true

  5. 如果xundefinedynull,返回true
  6. 如果Typex)是數目和類型(y)是字符串,返回
    比較 x == ToNumbery)的結果。
  7. 如果Typex)是字符串和類型(y)是Number,
    回到比較ToNumber(x)== y的結果。
  8. 如果Typex)是布爾值,返回的比較 ToNumberx)== y的結果。
  9. 如果Typey)是布爾值,返回的比較 x == ToNumbery)的結果。
  10. 如果Typex)或者是字符串,數字,或符號和類型(y)是Object,然後返回
    比較 x == ToPrimitivey)的結果。
  11. 如果Typex)是Object和類型(y)或者是字符串,數字,或符號,然後返回
    比較ToPrimitivex)== y的結果。
  12. 返回false
+0

https:// stackoverflow。com/questions/5491605/empty-arrays-seem-to-the-same-true-and-false-at-the-the-time- 這是JS ==比較的一個很好的參考,特別是與數組 – Matt