2017-09-04 43 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