2017-09-04 42 views
4

我使用Chrome瀏覽器60.x,並測試代碼isNaN([3])。 結果是false,但我無法理解它。爲什麼NaN([3])在JavaScript中是錯誤的?

[3]是一個數組,它不是空的。 我認爲[3]是數組對象,它不是一個數字。

否則isNaN(["ABC"])的結果是true。 而isNaN([1,2,3])的另一個結果是true。 所以我想javascript引擎是強制改變數組,其中數組有一個單一的元素。

請讓我知道發生了什麼isNaN數組參數的函數。

REF1:Why is isNaN(null) == false in JS?
REF2:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN


[編輯]謝謝大家的回答。

我明白JavaScript比較前隱式解析了值。

我在閱讀Nina Scholz的回答時發現了一個有用的鏈接。
比較表:http://dorey.github.io/JavaScript-Equality-Table/

+2

在標題你說'isNaN([3])= FALSE',在問題,你說,它是真... 它是什麼? – campovski

+0

強打字與弱打字。在。爲方便起見,允許使用某些語言,隱式轉換。在其他情況下,所有人都必須明確可靠性。 – WGroleau

+0

雖然'[3]'是確定性的[1,2,3]不是,JS通過應用類型強制隱式地使用這個事實。 – Redu

回答

4

當您使用isNaN它試圖您輸入的數值解析到number,然後檢查是否是NaN與否。

查看一些示例。

對於包含一個項目的數組,​​函數返回一個對象,該對象實際上將第一項保存爲一個值(請參閱console.log)。對於很多物品它返回NaN,所以你得到isNaN的結果 - >true

const a = new Number([3]); 
 
console.log(`a is ${a}`); 
 
console.log(`isNaN(a) - ${isNaN(a)}`); 
 

 

 
const b = new Number([3,4,5]); 
 
console.log(`b is ${b}`); 
 
console.log(`isNaN(b) - ${isNaN(b)}`);

1

因爲,在Javascript中的簡寫,,只包含一個數陣列被認爲是可澆注到它包含的數量。您可以看到此行爲與==

3 == [3] // returns true 

Additionaly,這也是爲什麼[0]是falsy值,而[n]n不爲零,是一個truthy值,錯誤的可怕的潛在來源。

[0] == false // returns true 
[1] == false // returns false 
+0

你可以使用triple等於包含類型檢查。 3 === [3] // false – Lostfields

+0

確切地說,我的觀點是關於發生的隱式轉換,而當您僅使用double-equals時發生這些轉換。這就是爲什麼我認爲將其納入答案並不相關的原因。 – Pac0

3

根據用於equality comparisons and sameness規則,該陣列被轉換,先用toString,然後到多個用於檢查。

console.log(isNaN([3])); 
 
console.log(isNaN('3')); // convert with toString to a primitive 
 
console.log(isNaN(3)); // convert to number

+0

這相當於[isNaN']標準(https://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number)..? (看起來相當複雜。) – Teemu

2

JavaScript的作品以下列方式:它試圖將對象轉換爲integer如果函數的參數預計爲整數。例如運行

x = increment([3]) 

將導致x = 4。因此運行

isNan([3]) 

將導致false,由於[3]被轉換到33是一個數字。同樣,["ABC"]無法轉換爲integer,因此isNaN(["ABC"]) = true。此外,JavaScript的未能[1,2,3]轉換爲數字,因爲在陣列是三個數字,因此

isNaN([1,2,3]) = true