2016-12-24 178 views
2

NaN是可疑起源的残留实现之一,但大部分是,我知道它是。然而,我今天这个输入到一个节点提示,无法真正理解它...为什么NaN =!NaN返回true?

NaN = !NaN 
> true 

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

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

console.log(NaN = !NaN);

+1

@pvg似乎不是重复的。 NaN与此处没有任何比较。 –

+1

@pvg我在发布之前做过搜索,没有看到我提出的具体问题的答案。 – newswim

+2

@MartinSmith你是对的,我误解了问题,删除了国旗。这个问题要简单得多,但难以在相关答案的海洋中找到答案。 – pvg

回答

9

您分配trueNaN而不是使用=====比较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;

+0

很好的答案,谢谢!更多理由我应该使用严格模式。 – newswim

+0

严格模式规则:) –

1

使用=操作,分配该值为一个变量。但是,您不知道的是通过这样做,它会返回正在分配的值。打字:

v = 1 

在JavaScript REPL将显示1,因为这是被分配到v。那么,这样做的:

NaN = !NaN 

意志NaN相反值本身分配给NaN。由于布尔型中的NaNfalse,因此布尔型中的!NaN必须为true

1

JavaScript是非常奇怪:当你写

NaN = true // true 

,你基本上做在你的说法,你会得到“真”。这与您编写时的行为相同

a = true // true 

其中返回赋值的右侧。但是,如果你添加var

var a = true // undefined 

那么不返回任何结果。此外,如果您用NaN替换NaN的表达式,例如

1/"a" = true // error! 

那么您将得到一个ReferenceError。我建议不要使用作业的返回值。行为是不确定的,你的代码很难阅读。您可以启用“严格模式”为您检查。

+0

不错!感谢您澄清! – newswim

2

尝试在strict模式下运行Javascript以避免大部分问题。

的NaN,空,假, “”,null,未定义,0等等,他们被视为falsy值(记住falsy!== false)在JavaScript中,无论您使用的是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等的原因之一,无论代码是多么简单。