NaN是可疑起源的残留实现之一,但在大多数情况下我得到它。但是,我今天将它输入到Node提示符中并且无法理解它......
NaN = !NaN
> true
这只是返回!NaN
的评估结果吗?这是有道理的,但我很惊讶在尝试将NaN分配给另一个值时没有错误。
注意:这个问题是关于这个特定的语法结构;有很多关于NaN和isNaN的问题,但我在google搜索后找不到答案。感谢Ori Drori致best answer thus far。
console.log(NaN = !NaN);

答案 0 :(得分:9)
您要将true
分配给NaN
,而不是使用NaN
或!NaN
将===
与==
进行比较,以便操作返回已分配的内容价值 - > true
。 Javascript默认忽略了这项任务,因为NaN
is read only。
console.log(NaN = true);
// NaN hasn't changed
console.log(NaN);
如果您要在代码中添加use strict
,则JS会抛出read only错误:
'use strict';
NaN = true;
答案 1 :(得分:4)
FullName
是指定运算符。
=
和==
是比较运算符。
===
也许更令人惊讶的是:
NaN == !NaN
false
NaN === !NaN
false
有关NaN的更多信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/NaN
答案 2 :(得分:2)
尝试以strict
模式运行Javascript以避免大多数问题。
NaN,null,false,"",null,undefined,0等在javascript中它们被视为虚假值(请记住falsy
!== false
),否你是否使用strict
模式。
// 'use strict';
console.log(!NaN); // true
console.log(!null); // true
console.log(!false); // true
console.log(!""); // true
console.log(!null); // true
console.log(!undefined); // true
console.log(!0); // true
在Python中也是如此,除了NaN。例如,
print(not False) # True
print(not None) # True
print(not float("NaN")) # False
print(not "") # True
print(not 0) # True
混乱之源 当我们使用多种语言时,它可能会引起混淆。
例如,
在Python 'cat' in ['fat', 'cat', 'rat', 'hat']
中返回True。
在Javascript 'cat' in ['fat', 'cat', 'rat', 'hat']
中(完全相同的代码段),无论您是否使用strict
模式,都会返回false。
在Python print(not [])
中返回True。
在Javascript console.log(![]);
中返回false。
这就是我总是喜欢使用调试器,REPL等的原因之一,无论代码多么简单。
答案 3 :(得分:1)
使用=
运算符,将值赋给变量。但是,您不知道的是,通过这样做,它返回所分配内容的值。打字:
v = 1
JavaScript中的将显示1,因为这是分配给v
的内容。所以,做:
NaN = !NaN
将NaN
的相反值分配给NaN
本身。由于布尔值中的NaN
为false
,因此布尔值中的!NaN
必须为true
。
答案 4 :(得分:1)
Javascript非常奇怪:当你写
时NaN = true // true
你基本上在你的陈述中做,你得到“真实”。这与您编写
时的行为相同a = true // true
返回作业的右侧。但是如果你添加var
并写
var a = true // undefined
然后什么都没有回来。此外,如果将NaN替换为计算结果为NaN的表达式,例如
1/"a" = true // error!
然后你得到一个ReferenceError。我建议永远不要使用赋值的返回值。行为是不确定的,您的代码将难以阅读。您可以启用“严格模式”来为您检查。