1. NaN を検出します 数学的には、任意の値 x は常にそれ自体と等しくなります:
x = x
ただし、この規則は = == および = == には適用されません。 NaN:
>
false
その結果、indexOf メソッドを使用して NaN を含む配列内で NaN を見つけることはできません。これは、メソッドが内部で === を使用して要素が次と等しいかどうかを判断するためです。パラメータで指定された値:
> ; [ NaN ].indexOf(NaN)
-1
翻訳者注: 同じことが switch ステートメントにも当てはまります
switch (NaN) {
case NaN:alert(NaN)
}
NaN を検出するために === を使用できない場合、何を使用すればよいでしょうか? グローバル関数 isNaN() がありますが、この関数には問題があります。つまり、パラメータの値が常に暗黙的に に変換されます。明らかに NaN ではない多くの値を判定する場合にも true を返します:
> isNaN("foo")
true
説明: "foo" は数値 NaN に変換されます。
> Number("foo")
NaN
NaN を検出するもう 1 つの方法 この方法は、NaN をそれ自体と厳密に等しくない唯一の値として使用することです:
function myIsNaN(value) {
return value
}
もう 1 つのよりわかりやすい方法は、isNaN() を使用する前に、値が数値型であるかどうかを確認することです。これにより、暗黙的な変換の問題が回避されます。 >
コードは次のとおりです。
2 の修正バージョンが追加されます。 between -0 and 0
このような要件はまれですが、JavaScript では 0 (正のゼロ) と -0 (負のゼロ) を区別する必要がある場合があります。これらは 2 つの異なる値です。しかし === はわかりません:
コードをコピー コードは次のとおりです。
> -0 === 0 true では、JavaScript では、正の数を −0 で割ると、結果は -Infinity になります。結果は Infinity です。これら 2 つの無限値は、次の === を使用して判断できます。
コードをコピーします。
コードは次のとおりです。 :
>
false
翻訳者注: 関数として記述されています
コードをコピー
コードは次のとおりです
}
3. ECMAScript.next のより厳密な等価性: "is" 演算子 ECMAScript.next には
"is" 演算子が含まれます。 、その機能は「より厳密な等価性」です。
NaN をそれ自体と等しいと見なすことができ、また、-0 と 0 を区別することもできます。 「isnt」と呼ばれる反対の演算子もあります。例:
> NaN は NaN
true
> -0 は 0 ではありません
true
現在、この演算子は Object.is() メソッド で補正できます。このメソッドは 次のように実装できます:
Object.is = function(x, y) {
if (x === y) ) {
// x === 0 => 0 と -0 を比較します
return x !== 0 || (1/x === 1/y);
// x !== y => x と y が両方とも NaN の場合にのみ true を返します
return x !== x && y !== y;
3.1 Object.is() を試してみる
Object.is()
を試したい場合は、
es6-shim を使用できます。これにより、一部の機能を ECMAScript.next (ECMAScript 6) から ECMAScript 5 に移植できます。 .
翻訳者注: ES3 環境で使用したい場合は、es5-shim
参照
を使用する必要があります。
JavaScript における等価性: === 対 ==
- ECMAScript.next: Eich による「TXJS」アップデート
- JavaScript における NaN と無限大
- es6-shim – ECMAScript 5 の ECMAScript 6 機能