私はそれ===
が通常恒等演算子と呼ばれることを知っています。比較される値は、等しいと見なされるために同じタイプと値である必要があります。では、なぜ以下の行がfalseを返すのでしょうか。
Array("asdf") === Array("asdf")
私はそれ===
が通常恒等演算子と呼ばれることを知っています。比較される値は、等しいと見なされるために同じタイプと値である必要があります。では、なぜ以下の行がfalseを返すのでしょうか。
Array("asdf") === Array("asdf")
これらの各ステートメントで新しい配列が作成されており、それぞれがまったく同じ内容のまったく新しい配列オブジェクトであるため、これらは等しくありません。2つの新しいオブジェクトを作成する場合:
var a = {};
var b = {};
a === b // false
新しいオブジェクト、配列、関数などを作成すると、まったく新しいオブジェクトがメモリに配置されます。別のオブジェクトと同じ内部を持つ新しいオブジェクトを作成しても、そのオブジェクトが既存のオブジェクトを魔法のように指すことはありません。オブジェクトは同じように見えるかもしれませんが、同じインスタンスを指していません。今、あなたの声明がそのようだったとしたら:
var arr = ['asdf'];
arr === arr; // true
これは明らかに真実です。===
は厳密な等式であり、恒等演算子ではありません。オブジェクトが厳密な等式演算子を介して実行されると、オブジェクトが同じ参照を指しているかどうかがチェックされます。前に説明したように、使用するたびに、new Array
または[]
まったく新しいオブジェクトが作成され、それぞれが新しく異なる参照になります。したがって、2つの配列、または任意のオブジェクトが、まったく同じ配列を指してい===
ない限り、真になることはありません。2つのオブジェクトが同じ内容で作成されているからといって、それらが同じオブジェクトを指しているわけではなく、2つの同じであるが異なるオブジェクトを指しているだけです。
関数の構築について考えてみましょう。
var Car = function (color) {
this.color = color;
};
var ford = new Car('green');
var chevy = new Car('green');
var toyota = ford;
ford === chevy // false
同じコンストラクターを使用しているからといって、呼び出すたびに同じオブジェクトが返されるわけではありません。むしろ、毎回新しいオブジェクトが返されます。両方の車が緑色であるからといって、同じ車であるとは限りません。
ford === toyota // true
Car
両方の変数がまったく同じ参照を指しているため、これは現在真実です。
まず第一に、===は厳密な等式であり、恒等演算子ではありません。オブジェクトのような配列は参照オブジェクトであり、数値や文字列の場合のように値オブジェクトではありません。
したがって、これら2つのアレイを比較すると、メモリ内に2つの異なるアレイが作成されます。それは言うのと同じだろう...
var x = { a: 1 };
var y = { a: 1 };
x === y; //false
そのような配列やオブジェクトを直接比較することはできません。
プリミティブ型(文字列、数値、ブール)でない場合、配列またはオブジェクトの場合、比較演算子はそれがまったく同じインスタンスであるかどうかをチェックするためです。それで
var a = ['as','ds'];
var b = a;
var c = ['as','ds'];
b == a; //will return true; (doesn't matter if it's == or === for non primitive types)
b == c; //will return false;
したがって、基本的には、配列を比較してすべての要素が同じかどうかを確認するための独自のメソッドを定義する必要があります。この種の関数は、非常に高価になる可能性があり、通常、この種のものを作成する別の方法があるため、通常は存在しません。
動作してarray1==array2
いないように見えますが(オブジェクトIDの同等性)、
最も簡単なオプションは、ほとんどすべての場合に機能しますnull!==undefined
が、両方ともnullに変換され、等しいと見なされます。
function arraysEqual(a1,a2) {
return JSON.stringify(a1)==JSON.stringify(a2);
}