1. ホーム
  2. javascript

[解決済み] (NaN != NaN)と(NaN !== NaN)の違いは何ですか?

2022-05-07 17:33:04

質問

まず最初に、私はどのように知っているかを述べたいと思います。 isNaN()Number.isNaN() の作業を行います。私は、次のように読んでいます。 決定版ガイド であるかどうかを確認する方法を示しています。 NaN :

x !== x

この結果 true もし xNaN .

しかし、ここで疑問が生じます。なぜ彼は厳密な比較を行っているのでしょうか?というのも、どうやら

x != x

は同じように動作します。両方のバージョンを使っても大丈夫なのか、それともJavaScriptの中で true に対して x !== xfalse に対して x != x ?

解決方法は?

まず最初に、以下のことを指摘します。 NaN は非常に特殊な値です。定義上、それ自身とは等しくない。これはJavaScriptの数値が準拠しているIEEE-754規格に由来しています。ビットが完全に一致する場合でも、quot;not a number" 値はそれ自身と等しくなることはありません。(IEEE-754では必ずしもそうではなく、複数の異なるnot a number"値を許容しています)。JavaScriptの他のすべての値はそれ自身と等しいのです。 NaN が特殊なだけです。

<ブロッククオート

...私は、JavaScriptでx !== xに対してtrueを、x != xに対してfalseを返すような値を見逃しているのでしょうか?

いいえ、そんなことはありません。唯一の違いは !==!= というのは、後者はオペランドの型を同じにするために、必要に応じて型強制を行うからです。で x != x と同じであり、オペランドの型は同じである。 x !== x .

の定義の冒頭から明らかです。 抽象的等値演算 :

  1. ReturnIfAbrupt(x)です。
  2. ReturnIfAbrupt(y)。
  3. Type(x)がType(y)と同じであれば

    厳密な等価比較 x === y の実行結果を返します。

  4. ...

最初の2ステップは、基本的な配管工事です。ですから実質的には一番最初のステップである == は、型が同じかどうかを確認し、同じなら === の代わりに !=!== は、その否定版に過ぎない。

ということは、フラナガンが正しいのであれば、唯一の NaN が真になります。 x !== x のみであることも確かである。 NaN に対して真を与えます。 x != x .

多くのJavaScriptプログラマは、デフォルトで ===!== を使うことで、緩い演算子による型強制の落とし穴を回避することができます。