web-dev-qa-db-ja.com

JavaScriptでNaN値が等しいかどうかを比較する

JavaScriptで2つの数値が等しいかどうかを比較する必要があります。値はNaNでもかまいません。私はこのコードを思いつきました:

if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...

それはうまく機能していますが、私には肥大化しています。もっと簡潔にしたいと思います。何か案は?

59
GOTO 0

Object.is()を使用して、2つの値が同じ値であるかどうかを判断します。次のいずれかが当てはまる場合、2つの値は同じです。

  • 両方undefined
  • 両方null
  • 両方trueまたは両方false
  • 同じ文字で同じ順序の同じ長さの両方の文字列
  • 両方同じオブジェクト
  • 数字との両方
    • 両方_+0_
    • 両方_-0_
    • 両方NaN
    • または、両方がゼロ以外であり、両方ともNaNではなく、両方とも同じ値を持つ

例えばObject.is(NaN, NaN) => true

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is を参照してください

5
Anant
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))

改善するものはありません。かっこを追加するだけで、わかりやすくなります。

51
ThiefMaster

isNaNを避けてください。その動作は誤解を招きます:

isNaN(undefined) // true

_.isNaN(from nderscore.js )は、期待どおりに動作するエレガントな関数です。

// Is the given value `NaN`?
// 
// `NaN` is the only value for which `===` is not reflexive.
_.isNaN = function(obj) {
  return obj !== obj;
};

_.isNaN(undefined) // false
_.isNaN(0/0) // true
23
davidchambers

if ( val1 === val2 )

一方または両方がNaNである場合、falseと評価されます。

また、NaN !== NaN

5
Esailija

比較方法に関係なく、NaNがそれ自体と等しくなることはないため、考えられる問題のより簡潔な解決策は、このかなり特別な比較を行うための記述名で関数呼び出しを作成し、その比較関数を使用することです代わりにコード。

また、未定義が未定義に等しいと判断した日にアルゴリズムの変更をローカライズするという利点もあります。

5

これらの2つの変数が数値であることを知っている限り、以下を試すことができます。

if (val1 + '' == val2 + '')

2つの値を文字列に変換します。面白い答えですが、うまくいくはずです。 :)

5
Grace Shao

そして、関数Number.isNaN()はどうですか?これは可能な限り使用する必要があると思います。

> NaN === NaN
false
> Number.isNaN
ƒ isNaN() { [native code] }
> Number.isNaN() === Number.isNaN()
true

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

2
mario ruiz

数値の場合、ソリューションは問題ありませんが、他のデータ型でも機能するように拡張するには、次のように提案します。

if(val1 === val2 || (val1 !== val1 && val2 !== val2))

グローバルisNaNである理由は誤りです。それはあなたのようなシナリオで間違った結果を与えます

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true 

ここで、同等のNaN比較についても網羅した包括的な回答を掲載しました。

JavaScript変数がNaNであるかどうかをテストする方法

2
dopeddude

この回答は、ThiefMaster、Esailija、Joachim Isaksson、davidchambersの提案を検討した後に作成しました。これをさらに改善できますか?

// Determines if two numeric values are equal.
// Also returns true when both parameters are NaN.
function areEqualNumeric(val1, val2) {
    return val1 === val2 || (val1 !== val1 && val2 !== val2);
}
1
GOTO 0