Javascript:两个Object/Array之间的等式比较

The*_*art 1 javascript jquery

让我们猜两个具有相同属性的对象:

var x = {a : 'some'},
      y = {a: 'some'};
Run Code Online (Sandbox Code Playgroud)

输出:

x == y;和x === y;两个提供虚假

同样对于两个阵列,

var p = [1, 2, 3],
      q = [1,2,3];
Run Code Online (Sandbox Code Playgroud)

p == q而p === q两者都可以false.

但是如果我遵循以下内容:

var x = y = {a: 'some'};
var p = q = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

以上比较给出了true.

为什么Javascript会做这样的事情?请解释.

T.J*_*der 5

以上比较给出了true.

对.你已经专门设置p,q所以他们引用同一个对象.

使用对象引用==(两者都是对象引用)并===检查引用是否指向同一对象.如果你有两个相同但又分开的对象,那么两者都将是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"
Run Code Online (Sandbox Code Playgroud)

对象的内容是无关紧要的,它是被检查的身份.

请注意,如果您使用==并且只有一侧是对象引用(例如,另一侧是数字,原始字符串undefined等),则不是这样.在这种情况下,将要求对象引用自身转换(转换为字符串或数字,具体取决于其他内容),然后转换后的结果将用于比较.这可能会导致令人惊讶的行为(例如,"2" == [[[[[2]]]]]是true因为数组被要求把自己变成一个字符串,它通过做join[这将要求其元素,将其转换为字符串,等等],和你结束了"2"在右手侧).所以我通常更喜欢===("严格平等" ==("松散平等").