JavaScriptで2つの数値が等しいかどうかを比較する必要があります。値はNaN
でもかまいません。私はこのコードを思いつきました:
if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...
それはうまく機能していますが、私には肥大化しています。もっと簡潔にしたいと思います。何か案は?
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 を参照してください
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
改善するものはありません。かっこを追加するだけで、わかりやすくなります。
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
if ( val1 === val2 )
一方または両方がNaN
である場合、falseと評価されます。
また、NaN !== NaN
比較方法に関係なく、NaNがそれ自体と等しくなることはないため、考えられる問題のより簡潔な解決策は、このかなり特別な比較を行うための記述名で関数呼び出しを作成し、その比較関数を使用することです代わりにコード。
また、未定義が未定義に等しいと判断した日にアルゴリズムの変更をローカライズするという利点もあります。
これらの2つの変数が数値であることを知っている限り、以下を試すことができます。
if (val1 + '' == val2 + '')
2つの値を文字列に変換します。面白い答えですが、うまくいくはずです。 :)
そして、関数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
数値の場合、ソリューションは問題ありませんが、他のデータ型でも機能するように拡張するには、次のように提案します。
if(val1 === val2 || (val1 !== val1 && val2 !== val2))
グローバルisNaN
である理由は誤りです。それはあなたのようなシナリオで間違った結果を与えます
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
ここで、同等のNaN比較についても網羅した包括的な回答を掲載しました。
この回答は、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);
}