关于javascript:JSON解析不等于原始

JSON parsed not equal to original

本问题已经有最佳答案,请猛点这里访问。

问题是,以下内容在逻辑上对我来说毫无意义,也许任何人都可以解释(解释json.parse/json.stringify究竟做了什么也会得到赞赏):

1
2
3
4
5
6
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


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

您可以通过将它们串起来进行比较:

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


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

以同样的方式:

1
2
3
4
var a = {norsk:"hei"};
var b = {norsk:"hei"};

a == b; // false

http://jsfiddle.net/amhbm/


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

比较属性norsk会得到预期的结果,因为它引用了一个字符串,而javascript会根据字符串的值比较字符串,在本例中,这些值是相同的。

不幸的是,以您希望的方式比较复杂的对象是一个复杂的事情,叫做structural equality,并且没有现成的简单方法可以做到这一点。


helloparsedHello指向两个独立的对象。你在比较参考文献,所以它们不相等。带对象的=====不会做"深相等";它只比较引用。

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


javascript中的两个对象不相等。我建议使用underscore的isequal方法比较对象。您可以在underline的github repo https://github.com/jashkenas/underline/blob/master/underline.js中找到它,并且仅当您不再需要此库中的任何内容时才使用此特定方法。