[英]Comparison array number in JS
我正在使用JS,但無法理解數組的某些行為。 我進行了搜索,但找不到正確的答案,如果這是重復的或與其他問題有關,請您抱歉。
我有使用lodash的以下代碼。
return _.difference(self.list1, self.list2) <= 0;
那是返回一個數組,我直接將它與一個數字進行比較,只是因為我忘記了.length屬性。 我看到這是“有效的”,除非不正確。 因此,我開始使用JS控制台進行一些測試,但我不明白這里發生了什么。
[Object, Object, Object] <= 0 //returns false
[] <= 0 //returns true
[[]] <= 0 //returns true
[[[]]] <= 0 //returns true
[[2]] <= 0 // returns false
[[],[]] <= 0 //returns false
JS在這里做什么? 非常感謝你。
<=
運算符將強制其操作數嘗試使其具有可比性。 完整細節在規范的“ 抽象關系比較”操作中 ,但基本上是:
當您將對象引用與基元進行比較時,它將嘗試將引用的對象轉換為基元。 在這種情況下,由於原語是一個數字,因此如果對象支持(數組不支持),它將嘗試從該對象中獲取一個原語號,然后返回獲取字符串。 此時,它具有一個字符串和一個數字,因此它將字符串強制為數字,並對其進行數值比較。
將數組轉換為字符串時, join
會執行相同的操作:將所有條目的字符串版本連接在一起,並用逗號分隔。 當然,如果只有一個條目,那么最終只會得到該條目(作為字符串)。
這是一個更簡單的示例:
var a = [2]; console.log(a < 10); // true
步驟如下:
由於a
包含一個對象的引用,該對象轉換為原始的,寧願一個數字,以如果可能的字符串:
a.toString()
a.toString()
調用a.join()
,將條目作為字符串連接在一起,並且之間用逗號隔開 "2"
結尾。
現在我們有"2" < 10
由於其中一個是數字,因此運算符將另一個強制為數字,使我們2 < 10
2 < 10
的結果為true
這種策略有時甚至頻繁,這意味着<=
運算符最終會將NaN
與某些內容進行比較。 例如,如果a
是非數組對象:
var a = {}; console.log(a.toString()) // "[object Object]" console.log(a < 10); // false
步驟將是:
由於a
包含一個對象的引用,該對象轉換為原始的,寧願一個數字,以如果可能的字符串:
普通對象不支持轉換為數字,因此我們最終(有效地)完成了a.toString()
。
如您在上面的代碼段中所看到的,這給了我們"[object Object]"
現在我們有"[object Object]" < 10
由於其中一個是數字,因此操作員會將另一個強制為數字。 強制為數字的"[object Object]"
為NaN
。
NaN < 10
的結果為false
,因為所有涉及NaN
比較(包括===
)均===
false
。 (是的,真的; NaN === NaN
是false
。)
(感謝Rajesh提出了{} < 10
示例並提供了上述示例的初始版本。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.