2016-12-24 298 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等的原因之一,無論代碼是多麼簡單。