1

同じプロパティを持つ 2 つのオブジェクトを推測してみましょう。

var x = {a : 'some'},
      y = {a: 'some'};

出力:

x == y;両方ともx === y;falseを返します

同様に、2 つの配列の場合、

var p = [1, 2, 3],
      q = [1,2,3];

p == qp === q両方を与えfalseます。

しかし、私が次のことをした場合:

var x = y = {a: 'some'};
var p = q = [1, 2, 3];

上記のすべての比較が与えられtrueます。

なぜJavascriptはそのようなことをするのですか? 説明してください。

4

3 に答える 3

5

上記のすべての比較が与えられtrueます。

右。明確に設定pqたので、それらは同じオブジェクトを参照します。

オブジェクト参照の==場合、両方 (両方がオブジェクト参照の場合) とは、参照が同じ object===を指しているかどうかを確認します。2 つの同一の別々のオブジェクトがある場合、両方とも常に になります。false

たとえば、次のようになります。

var a = {}; // a points to an object
var b = {}; // b points to a _different_ object
console.log(a === b); // "false"
console.log(a == b);  // "false"

var c = {}; // c points to an object
var d = c;  // d points to _the same_ object
console.log(c === d); // "true"
console.log(c == d);  // "true"

オブジェクトの内容は関係ありません。チェックされるのはオブジェクトの ID です。

==を使用し、片側だけがオブジェクト参照である場合 (たとえば、反対側が数値、プリミティブ文字列など) 、これは当てはまらないことに注意してくださいundefined。その場合、オブジェクト参照はそれ自体を変換するように求められ (他のものが何であるかに応じて、文字列または数値に)、変換された結果が比較に使用されます。これは驚くべき動作につながる可能性があります (たとえば、配列"2" == [[[[[2]]]]]が自分自身を文字列に変換するように要求され、[要素に自分自身を文字列に変換するように要求するなど] をtrue介しjoinて行うため)、最終的には次のようになります。"2"右側にあります)。したがって、私は通常、 (「緩やかな平等」)よりも===(「厳密な平等」 ) を好みます。==

于 2012-05-12T08:57:31.817 に答える
3

これは次の理由で発生します。

var p = [1, 2, 3],
q = [1,2,3];

配列の 2 つのインスタンスを作成します。JS の等値演算子は、非プリミティブ データを比較するときに、それらが同じインスタンスであるかどうかのみをチェックし、値やプロパティの詳細なチェックは行いません。

コード付き

var p = q = [1, 2, 3];

配列の 1 つのインスタンスを作成し、このインスタンスを変数pおよびに割り当てますq。したがって、両方の変数が同じインスタンスへの参照を格納するため、等値演算子は true を返します。

于 2012-05-12T08:58:29.147 に答える
2

この場合、変数は2つの別々のオブジェクトを指しているため、等しくありません。

var x = {a:'some'}, // one object with "a" = "some"
    y = {a:'some'}; // another object with "a" = "some"

var p = [1,2,3],    // one array with 1,2 and 3
    q = [1,2,3];    // another array with 1,2 and 3

しかし、この場合、それらは同じオブジェクトを指しているため、

var x = y = {a: 'some'};
//is like:
var x = {a:'some'}, // x points to an object
    y = x;          // y is given reference to whatever x is pointing at


var p = q = [1,2,3];
//is like:
var p = [1,2,3],    // p points to an array
    q = p;          // q is given reference to whatever p is pointing at
于 2012-05-12T09:00:00.907 に答える