我用 JavaScript 编程已经有一段时间了,但我从未注意到它对 value 的特殊性NaN
。
我决定进行调查,发现最多的是:NaN - JavaScript | MDN / [英文] .
我知道这NaN
是“非数字”的引用(它不是数字),但我不清楚为什么使用运算符==
,的 NaN 不等于另一个 NaN ===
。
parseFloat('NaN') == parseFloat('NaN'); // false
parseFloat('NaN') == NaN; // false
NaN == NaN; // false
在不满足相等的逻辑级别会发生什么?为什么它也不适用于表达式undefined == undefined
?
这就是它的定义方式,它是有道理的,例如想象以下情况:
a
和b
他们的结果一样多NaN
。现在,您认为它们相同是正确的吗?这就是为什么该函数用于
isNaN()
验证我们是否正在处理一个NaN
,而不是尝试将它与另一个进行比较NaN
。这不适用于,
undefined
因为这具有精确的含义:未定义的标识符。相反NaN
,对于其他语言中的运行时错误或异常来说,它是一种无效值。简单来说
NaN Not a Number
(NaN 不是数字),因为它不是数字,所以它是任何东西。无法将一侧的任何内容与另一侧的任何内容进行比较,因此无法保证两者相同。例如,无法进行此比较:此比较与以下内容相同:
在 JavaScript
undefined
中,它是一种数据类型,就像Number
,String
,或. 在 JavaScript 中,与其他强类型编程语言不同,我们可以拥有 type 的变量。Boolean
Object
Array
undefined
总之,在 JavaScript 中,所有未定义(因此不存在)或已定义但未分配值的变量始终是 type
undefined
。所以从逻辑上讲,当比较具有相同数据类型的两个事物时,在这种情况下
undefined
,它会返回Verdadero
。参考:Java 语言规范 (JLS)
查看 NaN文档
你会看到他的评论
换句话说,您必须使用
isNaN()
来实现您的建议。我想之所以如此,是因为它是一个对象,在使用时通过引用进行比较,
==
因此没有两个引用是相等的。undefined不会发生同样的情况, 因为这是一个原始值,它不是像 NaN 这样的对象,因此您可以将其与 equal 进行比较。