2017-06-01 23 views

回答

9

基本上你獲得implicid類型轉換,第一toString

Array對象覆蓋的ObjecttoString方法。對於Array對象,toString方法會加入數組並返回一個包含每個由逗號分隔的數組元素的字符串。

當數組要被表示爲文本值或者在字符串連接中引用數組時,JavaScript自動調用toString方法。

join的作品,然後它被轉換爲數字。

what you do what you get result array  string  number 
------------ ------------ ------ --------- -------- ---------- 
var a = []; 
0 < a   0 < 0   false []  -> ''  -> 0 
a.push(1); 
0 < a   0 < 1   true [1]  -> '1'  -> 1 
a.push(2); 
0 < a   0 < NaN  false [1, 2] -> '1,2' -> NaN 
a.push(3); 
0 < a   0 < NaN  false [1, 2, 3] -> '1,2,3' -> NaN 
+1

您有沒有參考JavaScript在這種情況下首先執行轉換爲字符串,然後轉換爲數字? – trincot

+0

Obligatory [jsF ** *解釋](http://thedailywtf.com/articles/bidding-on-security) – ryanyuyu

+0

@trincot,ECMA 262 V 6 [7.2.11 抽象關係比較](https://www.ecma-international.org /ecma-262/6.0/#sec-abstract-relational-comparison),它試圖首先得到一個原始值,這是通過toString得到的。 –

0

如果要比較的數組lenght,使用a.length

1

如果你在上面的每一行之後檢查數組作爲數字,它會給你答案。 記住JavaScript的比較

Number(a); //insert this after each line 
+0

爲什麼'push(2)'和'push(3)'返回'NaN'? – doutriforce

+0

'console.log(a.toString(),Number(a.toString())' – epascarello

0

期間做一些類型轉換在JS如果你只有1數組中元素,JS將計算像元他的價值,你的情況 - 數。 例如:

var b[] 
b.push(8); 
b == 8 //true (but b === 8 is false!) 

如果你有在陣列中更然後1個元件,陣列類型是陣列[數字]這是從數不同勢和因爲你不能比較它的數。

這就是爲什麼在你的代碼後,你這樣做:

var a=[] 
0<a 
a.push(1) 
0<a 

你得到的監守一個true值現在是「1」,而更大然後0。但是,接下來的推值爲[1後, 2],而不是一個數字(NaN),這就是爲什麼你會錯誤。

1

在像JS鬆散類型的語言,你必須要注意一個可變型像數組如何脅迫到一個不變的類型。基本[1,2]變成"1,2"

所以[1,2] == "1,2" // <- true

+0

這與價值是否不可改變無關。即使數組通過Object.freeze變得不可變,你也會得到這種強制。 – trincot

+0

是的你是對的。我的意思是類型強制是針對不可改變的類型。 – Redu

+0

我認爲你的意思是「原始的」,而不是「不變的」。也有不可變的對象,強制不是針對他們的。 – trincot

0

對於比較,JavaScript的嘗試的操作數轉換成數通常(優選的)。

請看下面的例子:

console.log("test" == true);//false 
console.log("test" == false);//false 

爲什麼?因爲試圖將「test」轉換爲Number,所以Number(「test」)給出NaN,而NaN不等於true或false。 同樣,

0<a becomes 0 < Number(a) becomes 0 < 0 returns "false". 

作爲一個特殊的情況下,當數組有一個元素,Number能夠要挾,要了一些,但是當你添加多個元素,應該返回什麼號碼? 在這種情況下,Number(arr)變爲NaN,並且0不小於NaN。

3

數字和數組之間的比較將觸發類型轉換。 EcmaScript規範在section 7.1.3中規定了這個規則。根據這些規則,數量並不轉換爲另一種數據類型,但對象(一個陣列是一個對象)將受到該是這樣的轉化:

  1. primValue是ToPrimitive (參數,提示號碼)。
  2. Return ToNumber(primValue)。

ToPrimitive的功能在section 7.1.1描述:

  • exoticToPrim是GetMethod(輸入,@@ toPrimitive)。
  • @@toPrimitive是一個符號,它可以訪問爲Symbol.toPrimitive。事情是,Array不具有此特性,所以該過程與此步驟繼續:

  • 返回OrdinaryToPrimitive(輸入,暗示)。
  • 當抽象操作OrdinaryToPrimitive被稱爲帶有參數O和提示,採取以下步驟:

  • 如果暗示爲 「」 然後,
        a。讓methodNames be«「toString」,「valueOf」»。
  • 否則,
        a。讓方法名稱是«「valueOf」,「toString」»。
  • 作爲暗示爲 「」,我們是在第二種情況下。接下來的步驟解釋了這些方法是按順序應用的。

    現在,Array.prototype.valueOf只是返回數組本身,所以下面的子步驟將不會返回,因爲類型 Object(即Array)。

    5.c.iii如果Type(結果)不是Object,返回結果

    因此後退開始,並在陣列上調用toString

    所以數組被轉換爲字符串。這是第一個在上面列出的兩個步驟的結果:

    1. primValue是ToPrimitive(說法,提示號碼)。
    2. Return ToNumber(primValue)。

    第二步是更容易:然後將字符串轉換爲數字,其在section 7.1.3.1說明。

    由於Array.prototype.toString方法創建逗號分隔列表,只要數組有一個以上的元素,這些字符串就會變成無效數字。如規格中所述,返回值爲NaN

    任何<NaN比較返回false,它解釋了你得到的輸出。

    相關問題