簡體   English   中英

JS中的比較數組編號

[英]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 

步驟如下:

  1. 由於a包含一個對象的引用,該對象轉換為原始的,寧願一個數字,以如果可能的字符串:

    • 數組不提供轉換為數字的方法,因此我們最終(有效地)完成了a.toString()
    • a.toString()調用a.join() ,將條目作為字符串連接在一起,並且之間用逗號隔開
    • 所以我們以"2"結尾。


    現在我們有"2" < 10

  2. 由於其中一個是數字,因此運算符將另一個強制為數字,使我們2 < 10

  3. 2 < 10的結果為true

這種策略有時甚至頻繁,這意味着<=運算符最終會將NaN與某些內容進行比較。 例如,如果a是非數組對象:

 var a = {}; console.log(a.toString()) // "[object Object]" console.log(a < 10); // false 

步驟將是:

  1. 由於a包含一個對象的引用,該對象轉換為原始的,寧願一個數字,以如果可能的字符串:

    • 普通對象不支持轉換為數字,因此我們最終(有效地)完成了a.toString()

    • 如您在上面的代碼段中所看到的,這給了我們"[object Object]"


    現在我們有"[object Object]" < 10

  2. 由於其中一個是數字,因此操作員會將另一個強制為數字。 強制為數字的"[object Object]"NaN

  3. NaN < 10的結果為false ,因為所有涉及NaN比較(包括=== )均=== false (是的,真的; NaN === NaNfalse 。)

(感謝Rajesh提出了{} < 10示例並提供了上述示例的初始版本。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM