为什么NaN =!NaN返回true?

时间:2016-12-24 21:08:44

标签: javascript node.js nan assignment-operator

NaN是可疑起源的残留实现之一,但在大多数情况下我得到它。但是,我今天将它输入到Node提示符中并且无法理解它......

NaN = !NaN
> true

这只是返回!NaN的评估结果吗?这是有道理的,但我很惊讶在尝试将NaN分配给另一个值时没有错误。

注意:这个问题是关于这个特定的语法结构;有很多关于NaN和isNaN的问题,但我在google搜索后找不到答案。感谢Ori Drori致best answer thus far



console.log(NaN = !NaN);




5 个答案:

答案 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本身。由于布尔值中的NaNfalse,因此布尔值中的!NaN必须为true

答案 4 :(得分:1)

Javascript非常奇怪:当你写

NaN = true  // true

你基本上在你的陈述中做,你得到“真实”。这与您编写

时的行为相同
a = true  // true

返回作业的右侧。但是如果你添加var并写

var a = true  // undefined

然后什么都没有回来。此外,如果将NaN替换为计算结果为NaN的表达式,例如

1/"a" = true  // error!

然后你得到一个ReferenceError。我建议永远不要使用赋值的返回值。行为是不确定的,您的代码将难以阅读。您可以启用“严格模式”来为您检查。