2012-01-22 7 views
52

Javascriptで等しいことを示す2つの数値を比較する必要があります。値はNaNでもよい。 私はこのコードを作ってみた:Javascriptでの等価性のNaN値の比較

正常に動作している
if (val1 == val2 || isNaN(val1) && isNaN(val2)) ... 

が、それは私には肥大化に見えます。私はそれをより簡潔にしたいと思います。何か案は?

+7

混合を参照の

真(NaNでは、NaN)=>は '||'と '' &&一部括弧なしで非常に醜いと紛らわしいです。 – ThiefMaster

+9

'NaN'と' NaN'は両方とも 'NaN'と評価されますが、例えば' 0/0'と 'parseInt("ではない! ")'のような理由で等しくないと思われます。等しいとはみなされません。 –

+1

@Peterこの違いは、アルゴリズムと無関係になることがあります。私はこれがOPのケースだと思う。 – drigoangelo

答えて

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

改善の必要はありません。すべての人に明瞭にするためにかっこを追加するだけです。

+6

'NaN === NaN'が真を返すべき理由を説明するコメントで改善したいと思います。 – Esailija

4

if (val1 === val2)

どちらか一方または両方は、それが偽と評価されますNaNしている場合。

また、NaN !== NaN

+0

これは同等ではありませんか?OPは、val1とval2の両方が '' NaN'''であれば真を返すことを望んでいました。 –

5

NaNは関係なく、比較方法自体に等しいことはありませんので、私は考えることができるあなたの問題のための唯一のより簡潔な解決策を行うための説明的な名前を持つ関数呼び出しを作成することですこれはかなり特別な比較であり、あなたのコードでその比較関数を代わりに使用します。また、あなたが未定義のはあまりにも未定義に等しくなるべきであると判断した日のアルゴリズムに変更をローカライズすることの利点を持っているでしょう

4

限り、あなたはこれらの2つの変数が数値である知っているように、あなたが試すことができます:

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

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

+1

元のコードには常に同じ結果が得られるとは限りませんが、変更される場合には、これが推奨動作になる可能性があります。たとえば '" "== 0;'は 'true'ですが、コードでは' false'となります。これは改善と考えられます。 –

22

isNaNを避けてください。その動作は誤解を招くです:私はThiefMaster、Esailija、ヨアヒムIsakssonとdavidchambersの提案を検討した後、この答えを作成し

// 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 
+1

'undefined'は' Number'に変換されたときに 'NaN'になります...それは' isNaN'段階の間にそれを知る方がはるかに優れています。 – Esailija

+7

'isNaN(undefined)'が 'true'の何が問題になっていますか? 'undefined' **は数字ではありません**。あなたのためにここで誤解を招くようなことは何ですか? – trejder

+5

@trejder:NaNと未定義は異なる値です。異なる値*型*、でも。 – davidchambers

1

Underscore.jsから)
isNaN(undefined) // true 

_.isNaNが期待通りに動作するエレガントな機能です。これはさらに改善できますか?

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

AngularJSはそれ以上の改善が必要ないと思いますが、AngularJSはまったく同じコードを使用します。compare = function(a、b){return a === b || (a!== a && b!== b); }; ' – Ande

2

なぜこのようなif文?

if (isNaN(x) == true){ 
     alert("This is not a number."); 
    } 
2

数値例のためのソリューションは結構ですが、同様に次のように私の提案は以下のようになり、他のデータ・タイプのために働くためにそれを拡張するために:グローバルisNaN

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

理由が誤っています。それはあなたに私も平等のためのNaNの比較をカバーし、ここで、包括的な答えを掲載している

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

のようなシナリオで間違った結果が得られます。 NaNを持つ

How to test if a JavaScript variable is NaN

0

平等の比較は常にFalseになります。

javacript関数isNaN()がNaNと等しいかどうかをチェックできます。 例:

1. isNaN(123) //false 

2. var array = [3, NaN]; 

for(var i = 0 ; i< array.length; i++){ 
    if(isNaN(array[i])){ 
     console.log("True ---- Values of " + i); 
    } else { 
     console.log("false ---- Values of " + i); 
    } 
} 

結果:

偽----アレイを使用して別の方法を見つけた1

-1

の0

真----値の値。プロトタイプ。MDN linkを含む。どうやら、[NaN] .includes(NaN)はNaNに対してtrueを返します。

function IsActuallyNaN(obj) { 
    return [obj].includes(NaN); 
} 

また、私たちはもっと簡単なダビデチャンバーのソリューションを利用できます。

function IsActuallyNaN2(obj) { 
    return obj !== obj; 
} 
+0

あなたが答えを書いているときは、あなたのコードについての説明はほとんどありません。 –

+0

これのためだけに配列リテラルを構築しないでください。 ES6メソッドを使いたい場合は、 'Object.is(obj、NaN)'を使います。 – Bergi

1

Object.is()を使用してみてください、それは、2つの値が同じ値であるか否かを判定する。次のいずれかを保持している場合、2つの値は同じです:

両方未定義

両方ともNULL

両方の真または偽の両方

同じで、同じ文字と同じ長さの両方の文字列順

両方とも同じオブジェクト

両方番号と

両方+0

両方-0

両方のNaN

例えばObject.is https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

関連する問題