解析的JSON不等于原始版本

时间:2013-09-11 20:16:36

标签: javascript json

问题在于以下内容对我来说在逻辑上没有任何意义,也许任何人都可以解释(解释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

5 个答案:

答案 0 :(得分:5)

JS中的对象通过引用进行比较,因为您正在创建全新的对象 - 它们将不相等。

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

JSON.stringify(hello) === JSON.stringify(parsedHello)

答案 1 :(得分:2)

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

以同样的方式:

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

a == b; // false

http://jsfiddle.net/AMHbM/

答案 2 :(得分:0)

Javascript中的两个对象不相等。我建议使用underscore的isEqual方法来比较对象。您可以在Underscore的GitHub repo https://github.com/jashkenas/underscore/blob/master/underscore.js中找到它,如果您不需要此库中的任何其他内容,则只能使用此特定方法。

答案 3 :(得分:0)

helloparsedHello指向两个单独的对象。您正在比较参考文献,因此这些参考文献并不相同。带有对象的=====不会做“深度平等”;它只比较参考文献。

有关比较JavaScript对象的详细信息,请参阅here

答案 4 :(得分:0)

这里的混淆是你要比较两个对象是否相等,但即使它们所代表的数据是相同的,它们也是不同的实例。

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

不幸的是,以您想要的方式比较复杂对象是一个复杂的事情,称为structural equality,开箱即用的方法并不容易。