2012-03-17 12 views
5

javascriptの中で作業するとき、誰かが私に平等/不等式と型変換をテストする上で良いリファレンスまたは説明を提供できますか?JavaScriptの平等

私はeqeq(==)とeqeqeq(===)の使用について2つの考え方があるのを見ていますが、eqeqを使用しないでください使用するのがより安全です。

私はいくつかの基本的なサンプルで遊んでてきたと私はトラブル差や時に最高の他の上のいずれかを使用する目の肥えを持っています:

例えば:ここで私は書いていたいくつかの基本的なスクリプトです。 eqeqまたはeqeqeqを使ってテストすると、同じ結果が得られます。私は別の結果を得る例をまだ見ていません(つまり、eqeqを使用するとeqeqeqがfalseを返すtrueを返します)。

function write(message){ 

    document.getElementById('message').innerHTML += message +'<br/>'; 
} 


var tim = { name: "tim" }; 
var tim2 = { name: "tim" }; 
//objects are equal to themselves (== vs ==== eqeq or eqeqeq) 
write("tim eq tim: " + (tim == tim)); //returns true 

//objects are only equal to themselves regardless of containing value got that 
write("tim eq tim2: " + (tim === tim2)); //returns false 

//access the primative type to test true or false 
write("tim value eq tim2 value: " + (tim.name === tim2.name)); //returns true 
//how does this differ in efficency over the eqeq operator? is one safer to use over the other? 
//write("tim value eq tim2 value: " + (tim.name == tim2.name)); //also returns true 

//testing primatives 

write("apple eqeqeq apple: " + ("apple" === "apple")); //true 
write("apple eqeqeq apple: " + ("apple" == "apple")); //true 

誰かが私が読むことができる説明や参照を提供できますか?

歓声、

+5

http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use –

答えて

3

==と===の差は非常に単純である:==値の比較です。 ===は値と型の比較です。 ===を使用すると、JavaScriptが動的に型を判別するのを防ぎ、正確に値を比較します。

5 == "5"  //true - JS compares the number 5 to a string of "5" and determines the contents are the same 
5 === "5" //false - A character is not a number, they can't be the same. 

0 == false //true - false is a bool, 0 is numerical, but JS determines that 0 evaluates to false 
0 === false //false - numeric is not boolean, they can't be exactly the same thing 

5 == 5.0  //true - need I say more? 
5 === 5.0 //true - one is a float and one is an int, but JS treats them all as numerical 

偽(失敗)と0(正当な結果)の両方を返すことができる関数でテストすることが重要です。

JSには、数値、文字列、ブール値、ヌル、および未定義の合計5つのプリミティブタイプがあります。 ===両方の引数が同じタイプのものであることを要求するには、trueを返すのに同じ型のが等しい値でなければなりません。 float型、int型、long型、short型などはありません。数値の型は数値でまとめられます。

0

===は、変数が同じ型と値を持つ場合にのみtrueを返す厳密な等価演算子です。

a = 1; 
b = "1"; 

a == b trueを返します、a === bはfalseを返します

0

==のルールは、あなたは、以下の例のすべての正しい答えを得ることができ、覚えやすいではないでしょうか?

"" == "0" // false 
0 == "" // true 
0 == "0" // true 
false == "false" // false 
false == "0" // true 
false == undefined // false 
false == null // false 
null == undefined // true 
" \t\r\n" == 0 // true 

だから、それだけで===を使用する方が良い、と==を使用することはありません。

+0

リストは、はるかに大きいです私は今日2時間を過ごし、もっと多くを見つけました。 '[]] ==" "'、 '0 ==" "'、 "" 1 == true' ...など。また、ソースを置く必要がありますhttp://bonsaiden.github.com/JavaScript-Garden/ #types.equality – ajax333221

+0

これらはすべて、Cを知っていれば意味があります。ポインタはintです。ブール値はintです。配列はポインタです。文字列は配列です。 NULLは(あった)0です。偽は0です。好奇心が強いなら、これで何が起きているのかを考えてみてください: '[0] == false // => true' – superlukas

1

簡単です。
==型変換を実行し、変換された値を目的の値と比較します。
===型変換を実行せずに直接値を比較します。
明らかに===は性能と精度の点で優れていますが、==は場合によっては納得がいくので、両方ともニーズに合っていれば使用できます。

comparisons

乾杯!

0

あなたは、JavaScriptが非常にゆるやかにタイプされた言語であると聞いたことがあります。

(==)演算子は、引数の値を比較したいだけで、その型について気にしない場合に使用されます。 5 == "5"のようにtrueを返します。これは、ユーザーがどのキーを押したかなどの文字列、文字、または整数であるかどうか気にしない場合など、見たい場合です。

しかし、そこには議論のタイプも重要なケースがあります。このような場合、演算子の型を比較したいと考えています。したがって、これらの場合、三重等価演算子を使用します。 たとえば、いくつかの加算演算または乗算演算を実行する場合、オペランドが互換性のある型であることを確認する必要があります。したがって、トリプル(===)演算子を使用します。以下は

1

次のすべての等価演算子に

を使用しているとき、あなたが期待しないであろうものの非常に完全なリストである真である:

0    ==   "" 
0    ==   " " 
0    ==   [] 
false   ==   "" 
false   ==   " " 
false   ==   [] 
[]    ==   "" 
null   ==   undefined 
"str"   ==   ["str"] 

"1"    ==   true 
"0"    ==   false 

"null"   !=   null 
"false"   !=   false 
"true"   !=   true 
"undefined"  !=   undefined 
"NaN"   !=   NaN 

NaN    !=   NaN   //exception: NO exception 
{}    !=   {}   //exception: same reference 
[]    !=   []   //exception: same reference 

-------------------------------------- 

new Number(10)  !==   10 
new String("str") !==   "str" 
NaN     !==   NaN  //exception: NO exception 
{}     !==   {}  //exception: same reference 
[]     !==   []  //exception: same reference 

(そのうちのいくつかはthis sourceから来ました)

結論として、==を使用しないでください。あなたがしたいときでさえ:。

「それは非常にのみ、厳密な等価演算子を使用することが推奨されるタイプが強要する必要が のケースでは、それが明示的に行われるべきであると は、言語の複雑な強制に残されていませんルール。

(source)