良い一日。
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。 リンクvermilion1 、 JS Gardenに感謝します。