为什么在JavaScript中NaN([3])是假的?

时间:2017-09-04 06:51:01

标签: javascript arrays

我使用Chrome浏览器60.x,并测试代码isNaN([3])。 结果是false,但我无法理解。

[3]是一个数组,它不是空的。 我认为[3]是数组对象,而不是数字。

否则isNaN(["ABC"])的结果为trueisNaN([1,2,3])的另一个结果是true。 所以我猜javascript引擎强制将数组更改为数组,该数组具有单个元素。

请让我知道数组参数发生了什么isNaN函数。

参考1: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/

5 个答案:

答案 0 :(得分:5)

当您使用isNaN时,它会尝试将您的输入值解析为number,然后检查它是否为NaN

查看一些示例。

对于具有一个项目的数组,Number()函数返回一个对象,该对象实际上将第一个项目保存为值(请参阅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 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:1)

因为,作为Javascript中的简写,只包含一个数字的数组被认为是可转换为它包含的数字。您可以使用==

查看此行为
3 == [3] // returns true

另外,这也是为什么[0]是一个假值,而[n] n不为零的原因是一个真正的价值,一个可怕的潜在错误来源。

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

答案 4 :(得分:0)

所以我们知道     ctrl.clear = function(evt){ ids = document.querySelectorAll("div.evt"+evt); angular.forEach(ids, function(elem, key){ id = elem.getAttribute("id"); view_id = document.querySelector("#" + id.replace("{{event}}", id) + " > div.webix_view").getAttribute("view_id"); viewid = view_id.replace('$', ''); var el = document.querySelector("#" + id.replace("{{event}}", id)); if (el && el.getAttribute('type') == 'datepicker') { elem = document.querySelector("#" + id.replace("{{event}}", id) + " > div.webix_view > div.webix_el_box > div.webix_inp_static"); elem.setAttribute("id", viewid); elem.innerHTML = ''; elem.innerText = ''; elem.textContent = ''; } else { document.querySelector("#" + id.replace("{{event}}", id) + " > div.webix_view > *").setAttribute("id", viewid); $$(viewid).setValue(''); } }); }

测试数字与带数字的数组的解决方法

isNaN([3]) // returns false

请记住,===表示匹配值 类型