Why is [1,[2,3]] != [1,[2,3]]
Possible Duplicate:
How do you determine equality for two JavaScript objects?
为什么[1,[2,3]] == [1,[2,3]]的评价是错误的?
此外,为什么会发生这种情况:
1 2
| var g = { a:1, b:2, c:3 };
g == { a:1, b:2, c:3 }; // false!! |
- 用===代替==。
- @罗伯特哈维为什么?[1,[2,3]] === [1,[2,3]]也是false。
- @罗伯特哈维-还是假的
- javascript很奇怪。
- @因为它们不是同一个物体。
- @罗伯特哈维,如果有这样的事情,我会说那是更错误的。:)
- 尼尔:谢谢:
- @斯布罗姆:我们需要埃多克斯1〔4〕:p
- 等号运算符的算法在ECMA-262第11.9.3节中定义。这一切归结为规则1。F:"1。如果类型(x)与类型(y)相同,则[…]f。如果x和y引用同一对象,则返回true。否则,返回false。"您正在比较两个对象,它们可能具有相同的内容,但却没有引用相同的对象。
- 正如zack在下面的答案注释中提到的,您可以使用json.stringify方法比较两个对象的值。但是,除非您将标准JSON JavaScript库添加到您的项目中,否则这只是向后兼容的。JSON.stringify({a:1}) == JSON.stringify({a:1})
- 就像Java和其他的OO语言一样:用相等的操作符比较两个对象,如果两个对象引用同一个对象,结果都是真的。为什么会让人困惑?
[]是使数组变为文本的快捷方式,而不是调用new Array()然后填充它。这对{}来说也是一个类似的故事。在您的示例中,实际上是按引用而不是按值进行比较。用new操作符构造的两个对象指向内存中的不同位置,当使用==操作符时,实际上是在说"这些对象指向内存中的相同位置吗?"。若要像预期的那样进行按值比较,需要对要比较的每个数组/对象的成员进行迭代,并逐个比较每个值。
- 有没有办法让他们平等?
- 参见stackoverflow.com/questions/201183
- @Pitaj是的,将对象转换为JSON并进行比较。jsfiddle.net/vza55
- @皮塔杰,他们必须是同一个对象才能真正平等。这意味着它们是由同一个调用构造的。现在,如果要测试值相等性,可以这样做。一种简单(不是最有效)的方法是将两者都转换为字符串。JSON.stringify(g) === JSON.stringify({a:1, b:2, c:3})是true,符合您的期望。
因为[]和创建了对象的新实例,但它们不相等。