JavaScriptの==と===の違い

すぐに警告します、はい、記事は少し間違っています。コメントを歓迎します。明確な説明があります)。



良い一日。



JavaScriptには、==と===という2つの類似した演算子があります。 それらの違いがわからない場合、これは多くの間違いにつながる可能性があります。 そこで、このトピックを開くことにしました。 ==と===が正確にどのように異なるか、それらがどのように機能するか、これが起こる理由、およびエラーを回避する方法。



演算子==は等値で比較しますが、===-同一性で比較します。 ===演算子の利点は、2つの値を同じ型にキャストしないことです。 このため、通常使用されます。



abc == undefined; // true,  abc = undefined | null abc === undefined; // true -   abc = undefined!
      
      





 abc == false; // true,  abc = false | 0 | '' | [] abc === false; // true,   abc = false!
      
      





結局のところ、falseと0(または ''、または[])を混同することはほとんどありません。



もちろん:

 5 === 5; // true true === true; // true 'abc' === 'abc'; // true
      
      







そして今、興味深い例です。

 5 == 5; // true 5 === 5; // true new Number(5) == 5; // true new Number(5) === 5; // false!
      
      







なぜこれが起こっているのですか? はい、任意の番号はNumberクラスのオブジェクトです。 しかし、あなたは数として数を想像することができます-いくつかの定数。 一度宣言され、常にそれ自体と同一です。 しかし、同時にNumberクラスの新しいオブジェクトを宣言します-値は同じですが、同一ではありません(これらはNumberクラスの2つの完全に異なるオブジェクトであるため)。



配列/オブジェクト



ただし、配列とオブジェクトの場合、両方の演算子は同じように機能し、同一性を比較します。

 var a = {}; a == {}; // false a === {}; // false a == a; // true a === a; // true
      
      







配列とオブジェクトを比較するために、特別な関数を書くことができます:

 function isEq(a, b){ if(a == b) return true; for(var i in a){ if(!isEq(a[i], b[i])) return false; } for(var i in b){ if(!isEq(a[i], b[i])) return false; } return true; }
      
      





少しずさんで、2サイクルあり、 hasOwnPropertyを忘れました。 まあ、それはやります。



この<-



別の落とし穴があります。 これはこれへのパスです。

 (function(){ this == 5; // true this === 5; // false }).call(5);
      
      







ここにそのような瞬間があります。 それを忘れないことは価値があります。



合計...



さて、ここで独自のスーパーフレームワークを作成していると想像してください。==の代わりに===演算子を積極的に使用します。それは単にそれがきれいだからです。

 func(new Number(5)); (function(){ func(this); }).call(5);
      
      







そのような例は実行可能ではないようです? お願い!



jQuery:

 $.each([1, 2, 3, 4, 5], function(){ func(this); });
      
      







さて、または私は図を拡大したかった。

 var Five = new Number(5); Five.a = 2; //  ,   5   //  - ... func(Five);
      
      







それだけです。誰かが役に立つことを願っています。 ご清聴ありがとうございました。



UPD。 リンクvermilion1JS Gardenに感謝します。



All Articles