數字和數組之間的比較將觸發類型轉換。 EcmaScript規範在section 7.1.3中規定了這個規則。根據這些規則,數量並不轉換爲另一種數據類型,但對象(一個陣列是一個對象)將受到該是這樣的轉化:
- 讓primValue是ToPrimitive (參數,提示號碼)。
- 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
。
所以數組被轉換爲字符串。這是第一個在上面列出的兩個步驟的結果:
- 讓primValue是ToPrimitive(說法,提示號碼)。
- Return ToNumber(primValue)。
第二步是更容易:然後將字符串轉換爲數字,其在section 7.1.3.1說明。
由於Array.prototype.toString
方法創建逗號分隔列表,只要數組有一個以上的元素,這些字符串就會變成無效數字。如規格中所述,返回值爲NaN
。
任何<
與NaN
比較返回false
,它解釋了你得到的輸出。
您有沒有參考JavaScript在這種情況下首先執行轉換爲字符串,然後轉換爲數字? – trincot
Obligatory [jsF ** *解釋](http://thedailywtf.com/articles/bidding-on-security) – ryanyuyu
@trincot,ECMA 262 V 6 [7.2.11 抽象關係比較](https://www.ecma-international.org /ecma-262/6.0/#sec-abstract-relational-comparison),它試圖首先得到一個原始值,這是通過toString得到的。 –