2016-12-24 8 views
2

NaNは疑わしい起源の痕跡のある実装の1つですが、大部分はです。となります。 なぜNaN =!NaNがtrueを返しますか?

NaN = !NaN 
> true 

が、これは単に !NaNの評価を行った結果を返している...しかし、私は今日ノードプロンプトにこれをタイプし、実際にそれを理解することができませんでしたか?これは理にかなっていますが、NaNを別の値に代入しようとするとエラーが発生しないことに驚いています。

注:この質問は、この特定の構文構造についてです。 NaNとisNaNに関する多くの質問がありますが、私はグーグルで答えを見つけることができませんでした。 best answer thus farのOri Droriに感謝します。

console.log(NaN = !NaN);

+1

@pvgは重複していないようです。 NaNと何も比較していません。 –

+1

@pvgこれを投稿する前に検索しましたが、私が求めていた特定の質問に対する回答が表示されませんでした。 – newswim

+2

@Martinあなたは正しいです、私は質問を誤読し、フラグを削除しました。これははるかに簡単ですが、関連する解答の海で愚か者をピン止めするのは難しいです。 – pvg

答えて

9

、操作を返すよう割り当て値 - >trueNaN is read onlyのため、Javascriptはこの割り当てを黙って無視します。あなたは割り当て、

'use strict'; 
 
NaN = true;

+0

偉大な答え、ありがとう!私が厳格なモードを使用するべきであるという理由がある。 – newswim

+0

厳密なモードのルール:) –

1

=演算子を使用して:あなたはあなたのコードにuse strictを追加します場合

console.log(NaN = true); 
 

 
// NaN hasn't changed 
 
console.log(NaN);

、JSは、代わりにread onlyエラーがスローされます変数への値。しかし、あなたが知らないものはそれを行うことであり、割り当てられているものの値を返します。タイピング:それはvに割り当てられたものであるため、

v = 1 

JavaScriptのREPLでは、1が表示されます。だから、やって:

NaN = !NaN 

自体NaNNaNの反対の値を割り当てます。ブール値でNaNfalseなので、ブール値で!NaNtrueでなければなりません。

1

Javascriptが本当に奇妙です:あなたは基本的にあなたの声明の中で行う

NaN = true // true 

を書くとき、あなたは「真」を取得します。これは書き込み時と同じ動作です。

a = true // true 

割り当ての右側が返されます。しかし、varを追加して

を書き込むと、
var a = true // undefined 

が返されます。あなたが例

1/"a" = true // error! 

ため、NaNに評価される式ではNaNを交換する場合も、あなたはにReferenceErrorを取得します。代入の戻り値を決して使用しないことをお勧めします。その動作は決定的ではなく、コードは読みにくいでしょう。これをチェックするために「厳密モード」を有効にすることができます。

+0

ニース!明確化のためにありがとう! – newswim

2

ほとんどの問題を回避するには、strictモードでJavascriptを実行してみてください。

偽ヌルNaNの、 ""、ヌル、未定義、0など、彼らは関係なく、あなたがstrictモードを使用するか、JavaScriptで(falsyを忘れないでください!== false)falsy値として考慮されていません。

// '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 

これは、NaN以外のPythonでも同様です。我々は複数の言語を使用する場合たとえば、混乱 の

print(not False)  # True 
print(not None)   # True 
print(not float("NaN")) # False 
print(not "")   # True 
print(not 0)   # True 

ソースは、時にはそれが混乱の原因になります。例えば

、Trueを返す'cat' in ['fat', 'cat', 'rat', 'hat'] Pythonで

JavaScriptで'cat' in ['fat', 'cat', 'rat', 'hat'](全く同じコード)は、strictモードを使用しているかどうかにかかわらずfalseを返します。

Python print(not [])ではTrueを返します。

Javascriptでconsole.log(![]);はfalseを返します。

これは、コードがどれほどシンプルであっても、常にデバッガ、REPLなどを使用するのが好きな理由の1つです。

関連する問題