【问题标题】:Why isNaN([3]) is false in JavaScript?为什么 isNaN([3]) 在 JavaScript 中为假?
【发布时间】:2019-07-22 11:07:38
【问题描述】:

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

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

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

请告诉我isNaN 数组参数函数发生了什么。

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


[编辑] 谢谢大家的回答。

我知道 javascript 在比较之前会隐式解析该值。

我在阅读 Nina Scholz 的回答时发现了一个有用的链接。
对照表:http://dorey.github.io/JavaScript-Equality-Table/

【问题讨论】:

  • 在标题中你说isNaN([3]) = false,有问题你说它是真的......它是什么?
  • 强类型与弱类型。在。为方便起见,某些语言允许隐式转换。在其他情况下,为了可靠性,所有内容都必须明确。
  • 虽然 [3] 是确定性的 [1,2,3] 不是,但 JS 通过应用类型强制隐式利用了这一事实。

标签: javascript arrays


【解决方案1】:

当您使用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)}`);

【讨论】:

    【解决方案2】:

    根据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

    【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      【解决方案4】:

      因为,作为 Javascript 中的简写,只包含一个数字的数组被认为可以转换为它包含的数字。你可以通过== 看到这种行为

      3 == [3] // returns true
      

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

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

      【讨论】:

      • 您也可以使用三等号来包括类型检查。 3 === [3] // 错误
      • 确切地说,我的观点是关于发生的隐式转换,并且这些转换仅在您使用双等号时发生。这就是为什么我认为将其包含在答案中无关紧要。
      【解决方案5】:

      所以我们知道 isNaN([3]) // returns false

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

      Number([3]) === [3] //returns false 
      Number(3) === 3 // returns true 
      

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

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 2012-11-22
        • 2014-01-10
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2021-06-30
        • 2010-09-12
        相关资源
        最近更新 更多