JSON解析不等于原始[重复]
Posted
技术标签:
【中文标题】JSON解析不等于原始[重复]【英文标题】:JSON parsed not equal to original [duplicate] 【发布时间】:2013-09-16 00:31:49 【问题描述】:问题是以下内容在逻辑上对我来说毫无意义,也许任何人都可以解释(解释 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
【问题讨论】:
***.com/questions/1068834/… 【参考方案1】:您有两个独立的对象,它们恰好包含相同的属性/数据。它们不相等,因为它们不是同一个对象。
同理:
var a = norsk: "hei";
var b = norsk: "hei";
a == b; // false
http://jsfiddle.net/AMHbM/
【讨论】:
【参考方案2】:JS 中的对象通过引用进行比较,因为您正在创建全新的对象 - 它们不会相等。
您可以通过对它们进行字符串化来比较它们:
JSON.stringify(hello) === JSON.stringify(parsedHello)
【讨论】:
这在这种情况下会起作用,但通常要小心使用这种方法。如果字符串中的属性乱序,即使对象具有完全相同的属性和值,这两个字符串也不会相等。 @JamesMontagne 同意,这里的例子只是为了展示字符串和对象比较的差异。【参考方案3】:javascript 中的两个对象不相等。我推荐使用underscore
的isEqual 方法来比较对象。您可以在 Underscore 的 GitHub repo https://github.com/jashkenas/underscore/blob/master/underscore.js 中找到它,并且仅在您不需要此库中的任何其他内容时才使用此特定方法。
【讨论】:
【参考方案4】:hello
和 parsedHello
指向两个独立的对象。您正在比较参考资料,因此这些参考资料不相等。带有对象的==
和===
不会执行“深度等于”;它只比较引用。
有关比较 JavaScript 对象的更多信息,请参阅 here。
【讨论】:
【参考方案5】:这里的困惑是您正在比较两个对象是否相等,但即使它们表示的数据相同,它们也是不同的实例。
比较属性norsk
可以得到预期的结果,因为它引用了一个字符串,而JavaScript 会根据它们的值来比较字符串,在这种情况下它们是相同的。
不幸的是,以您在上面想要的方式比较复杂对象是一个复杂的事情,称为structural equality
,并且没有简单的方法可以开箱即用。
【讨论】:
以上是关于JSON解析不等于原始[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JSON 字符串上的 JSON 解析抛出“无法将对象转换为原始值”