任何想法爲什麼它的行爲如此?具有空元素的有趣數組JavaScript行爲
回答
當==
用來比較不同類型的東西,像一個數組([null]
)和false
,它有它通過具體步驟,稱爲Abstract Equality Algorithm(以下引用),試圖強迫他們的東西,它可以比較。 (因爲==
是「鬆散的」相等操作。)
首先它看到如果操作數是null
或undefined
,但在這種情況下也不是。
然後看看它是否比較數字和字符串,但在這種情況下也不是這樣。
然後,看起來如果兩個操作數是布爾值,當然這些是。由於其中一個是布爾型的,因此它在規範中執行一個名爲ToNumber
的抽象操作,將另一個轉換爲數字並執行另一個操作==
。 (該Number
功能,作爲一個功能,而不是一個構造函數中使用時,基本上是抽象ToNumber
操作的包裝。)
所以
[null] == false
成爲
0 == false
...因爲ToNumber([null])
將其參數強制轉換爲字符串(通過ToPrimitive
),得到""
,然後將其轉換爲0
。
所以現在==
有一些操作數是一個數字。所以它將其他也轉換爲數字。 Number(false)
是0
。因此,[null] == false
是正確的。
那麼[null, null] == false
呢?當將[null, null]
轉換爲字符串時,我們得到","
,其中ToNumber
無法變成有效數字。所以它將它轉換爲NaN
。 NaN
有趣的事情之一是它是一個數字,但它永遠不會等於其他任何東西。所以:
[null, null] == false
成爲
NaN == false
成爲
NaN == 0
...這是false
,因爲(再次)NaN
永遠無所不能。
以下是摘要平等算法:
- ReturnIfAbrupt(
x
)。 - ReturnIfAbrupt(
y
)。 如果Type(
x
)是相同的類型(y
),然後一個)返回執行嚴格相等比較
x
===y
的結果。如果
x
是null
和y
是undefined
,返回true
。- 如果
x
是undefined
和y
是null
,返回true
。 - 如果Type(
x
)是數目和類型(y
)是字符串,返回
比較x
== ToNumber(y
)的結果。 - 如果Type(
x
)是字符串和類型(y
)是Number,
回到比較ToNumber(x
)==y
的結果。 - 如果Type(
x
)是布爾值,返回的比較 ToNumber(x
)==y
的結果。 - 如果Type(
y
)是布爾值,返回的比較x
== ToNumber(y
)的結果。 - 如果Type(
x
)或者是字符串,數字,或符號和類型(y
)是Object,然後返回
比較x
== ToPrimitive(y
)的結果。 - 如果Type(
x
)是Object和類型(y
)或者是字符串,數字,或符號,然後返回
比較ToPrimitive(x
)==y
的結果。 - 返回
false
。
https:// stackoverflow。com/questions/5491605/empty-arrays-seem-to-the-same-true-and-false-at-the-the-time- 這是JS ==比較的一個很好的參考,特別是與數組 – Matt
- 1. JavaScript/jQuery懸停函數行爲有趣 - 數組問題?
- 2. 具有空數組的JSON對象 - Javascript
- 3. 將具有+/- 1個元素的x元素大數組分解爲y數組
- 4. 具有0個元素的數組
- 5. JavaScript數組 - 選擇具有偶數值的元素
- 6. 數組有多少個元素不爲空或爲空?
- 7. 帶有單個元素的數組Javascript
- 8. Javascript/jquery從具有相同rel的元素創建數組?
- 9. 在javascript中計算具有特定日期的數組元素
- 10. 對具有可變元素數量的數組進行排序
- 11. 檢查數組是否有空元素
- 12. 數組元素爲空
- 13. JSON數組爲空,而具有的JSONObject
- 14. 檢查哪些數組元素具有空值
- 15. 檢查中元素的數組元素具有焦點
- 16. 有趣的數組陣列
- 17. 具有名稱空間的Xml元素
- 18. 有趣的LinqToSql行爲
- 19. mouseOver()有趣的行爲
- 20. 有趣的bash行爲
- 21. 有趣的代碼行爲
- 22. 有趣的行爲「NOEXEC ON」
- 23. 有趣的循環行爲?
- 24. tabNavigator有趣的行爲
- 25. Lua中有趣的行爲'...'
- 26. 來自具有某個類名的所有元素的Javascript數組
- 27. 如何在具有行元素的數組中使用EventListener
- 28. 將JavaScript數組聚合成具有不同元素長度的幾個數組?
- 29. 將數組拆分爲s個具有uniq元素的子集
- 30. 將組劃分爲具有相同元素數量的子集
'!!測試' – tymeJV
用'=='比較數組與非數組幾乎沒有實際用途,除非您認爲這種娛樂或您喜歡在ECMAScript規範中研究類型轉換規則的複雜性。這是什麼意思? – jfriend00
這已被問了幾次。尋找真相和虛假。 'if(非null,空字符串,0)'總是返回true。至於其他,看看test.toString()返回什麼,你會看到爲什麼[null] == false是true,[null,null] == false是false – mplungjan