我只是在Firefox的JavaScript控制台中尝试过,但以下两个语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
Run Code Online (Sandbox Code Playgroud) 为什么NaN值的比较与所有其他值的行为不同?也就是说,与运算符==,<=,> =,<,>的所有比较(其中一个或两个值为NaN)返回false,这与所有其他值的行为相反.
我想这可以通过某种方式简化数值计算,但我找不到明确说明的理由,甚至在Kahan 的IEEE 754状态讲义中也没有详细讨论其他设计决策.
这种异常行为在进行简单数据处理时会造成麻烦.例如,当在C程序中对某些实值字段的记录列表进行排序时,我需要编写额外的代码来处理NaN作为最大元素,否则排序算法可能会变得混乱.
编辑: 迄今为止的答案都认为比较NaNs毫无意义.
我同意,但这并不意味着正确的答案是错误的,而是一个非布尔值(NaB),幸运的是它不存在.
因此,在我看来,选择返回真或假的比较是任意的,对于一般数据处理,如果它遵循通常的定律(==的反射性,<= =,>的三分法),那将是有利的,以免数据结构依赖这些法律变得困惑.
因此,我要求打破这些法律的一些具体优势,而不仅仅是哲学推理.
编辑2: 我想我现在理解为什么使NaN最大化是一个坏主意,它会搞砸上限的计算.
可能需要NaN!= NaN以避免检测环路中的收敛,例如
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
Run Code Online (Sandbox Code Playgroud)
然而,最好通过比较绝对差异与小限制来编写.所以恕我直言,这是打破NaN反身性的一个相对弱的论据.
我有一个简单的问题(我希望!).在JS中,为什么isNaN(" ")评估为false,但false评估为true?
我正在对文本输入字段执行数值运算,并检查字段是否为空,""或NaN.当有人在场中输入少量空格时,我的验证在所有三个空格中都失败了,我很困惑为什么它超过了isNAN检查.
谢谢!
在TypeScript中,我们如何检查某些值是否为NaN?以下不起作用:
请重新评论一些参考资料以获取更多详细信息.
我正在做一些测试,在javascript中将值转换为整数,并在遇到这种奇怪的行为时在控制台中打印输出.
console.log(+[]) ==> 0
console.log(+[123]) ==> 123
console.log(+['123']) ==> 123
console.log(+[123, 456]) ==> NaN
console.log(+['123asdf']) ==> NaN
Run Code Online (Sandbox Code Playgroud)
我认为这些值是使用parseInt转换的,但结果却不是这样我去了javascript转换表http://www.w3schools.com/js/js_type_conversion.asp
这让我更好地了解如何执行转换.根据此表
[] => 0
[20] => 20
[10,20] => NaN
["twenty"] =>NaN
["ten","twenty"] => NaN
Run Code Online (Sandbox Code Playgroud)
因此,他们显然采用数组的第一个值并使用指定的规则进行转换.parseInt的规则不适用.
我测试得出这个结论.您可以将所有内容嵌套,它会给您相同的结果.
console.log(+[[[[[[[[[[[10]]]]]]]]]]]) => 10
Run Code Online (Sandbox Code Playgroud)
那么我想,好吧,如果是这样的话
console.log(+[undefined]) will return NaN
console.log(+[null]) will return 0
console.log(+[false]) will return 0
Run Code Online (Sandbox Code Playgroud)
这些是从javascript转换表到整数的预期值,但结果是
console.log(+[undefined]) => 0
console.log(+[null]) => 0
console.log(+[false]) => NaN
Run Code Online (Sandbox Code Playgroud)
最后一个是最奇怪的,因为false被转换为0,而不是NaN.有人可以解释这种奇怪的行为或解释如何执行此转换吗?