2014-11-24 33 views
1

我發現一個空數組或一個數字就是一個數字。爲什麼一個數組中的數字只有一個數字?

本主題是不是真的爲這個特殊的情況下,我想一個解釋:Why does isNaN(" ") equal false

document.write(isNaN([1,2,3])); // true 
document.write(isNaN([1,2,'abc'])); // true 
document.write(isNaN(['abc'])); // true 

// maybe explained through the above link 
document.write(isNaN([])); // false 

// but... 
document.write(isNaN([1])); // false 
document.write(isNaN([-3])); // false 
document.write(isNaN([1234567])); // false 
document.write(isNaN([-1.234])); // false 
document.write(isNaN([[123]])); // false 
document.write(isNaN(['1'])); // false 

誰能告訴我,爲什麼它是有道理的?

回答

3

isNaN其值強制轉換爲數字。 (See MDN

因爲數組的字符串表示爲它的所有的項目用逗號級聯的。由於逗號,數字表示爲NaN

但是,如果只有一個項目,因此沒有逗號,它能夠被轉換爲數字。

+0

是的,但這有什麼意義? – algorhythm 2014-11-24 13:13:37

+0

@algorhythm檢查[MDN:isNaN()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/isNaN)和舊的全局'isNaN()'和'Number.isNaN()' – 2014-11-24 13:15:34

+2

@algorhythm'isNaN':「[[如果參數強制爲'NaN',則返回'true',否則返回'false'。](http:// www。ecma-international.org/ecma-262/5.1/#sec-15.1.2.4)「 - 這裏的」強制「是指使用['ToNumber'](http://www.ecma-international.org/ecma-262 /5.1/#sec-9.3)對參數進行抽象操作,將字符串對象(如數組)和數字字符串(如1234567「',這是'[1234567]'的字符串化形式)。字符串形式的對象有一個逗號(如'「1,2,3」'),那麼該字符串不能被合理地轉換爲數字,所以它被強制轉換爲'NaN'。 – apsillers 2014-11-24 13:17:50

0

您正在使用全局函數,它有一些令人困惑的行爲,因爲它將非數字強制爲可導致NaN值的數字類型。這就是你的情況,包含單個數字元素的數組的字符串表示將成功解析爲單個數字元素的數值。

MDN

由於isNaN功能規範的最早的版本,其非數值參數的行爲一直撲朔迷離。當isNaN函數的參數不是Number類型時,該值首先被強制爲一個Number。然後測試結果值以確定它是否爲NaN。因此,對於非數字,強制爲數字類型時會生成有效的非NaN數值(特別是空字符串和布爾基元,當強制數字值爲零或一時),「假」返回值可能是意外的;例如,空字符串肯定「不是數字」。

還要注意,與ECMAScript的6,也有現在Number.isNaN方法,該方法根據MDN:

相較於全球isNaN()功能,Number.isNaN()不遭受強制轉換的問題該參數爲一個數字。這意味着現在可以安全地傳遞通常會轉換爲NaN的值,但實際上與NaN的值不同。這也意味着只有類型號的值也是NaN,返回true

不幸的是

即使ECMAScript的6 Number.isNaN方法都有其自身的問題,因爲在博客文章中概述 - Fixing the ugly JavaScript and ES6 NaN problem

相關問題