2

问题是以下在逻辑上对我来说毫无意义,也许任何人都可以解释(解释 JSON.parse/JSON.stringify 究竟做了什么也将不胜感激):

var hello = {norsk: "hei"}, parsedHello = JSON.parse(JSON.stringify(hello));
hello === parsedHello // false
hello == parsedHello // false
typeof(hello) // "object"
typeof(parsedHello) // "object"
hello.norsk === parsedHello.norsk // true
4

5 回答 5

5

JS 中的对象通过引用进行比较,并且由于您正在创建全新的对象 - 它们不会相等。

可以通过对它们进行字符串化来比较它们:

JSON.stringify(hello) === JSON.stringify(parsedHello)
于 2013-09-11T20:19:23.907 回答
2

您有两个独立的对象,它们恰好包含相同的属性/数据。它们不相等,因为它们不是同一个对象。

以同样的方式:

var a = {norsk: "hei"};
var b = {norsk: "hei"};

a == b; // false

http://jsfiddle.net/AMHbM/

于 2013-09-11T20:19:16.703 回答
0

Javascript 中的两个对象不相等。我推荐使用underscore's isEqual 方法来比较对象。您可以在 Underscore 的 GitHub 存储库https://github.com/jashkenas/underscore/blob/master/underscore.js中找到它,并且仅在您不需要此库中的任何其他内容时才使用此特定方法。

于 2013-09-11T20:20:45.803 回答
0

helloparsedHello指向两个单独的对象。您正在比较参考资料,因此这些参考资料不相等。==并且===与对象不会做“深度相等”;它只比较参考。

有关比较 JavaScript 对象的更多信息,请参阅此处

于 2013-09-11T20:21:39.930 回答
0

这里的困惑是您正在比较两个对象是否相等,但即使它们表示的数据相同,它们也是不同的实例。

比较该属性norsk会给您预期的结果,因为它引用了一个字符串,而 JavaScript 通过它们的值来比较字符串,在这种情况下是相同的。

不幸的是,以您在上面想要的方式比较复杂对象是一件复杂的事情structural equality,并且没有简单的方法可以开箱即用。

于 2013-09-11T20:22:46.847 回答