obj == JSON.parse(JSON.stringify(obj)) 为假 [重复]

Posted

技术标签:

【中文标题】obj == JSON.parse(JSON.stringify(obj)) 为假 [重复]【英文标题】:obj == JSON.parse(JSON.stringify(obj)) is false [duplicate] 【发布时间】:2014-09-11 01:43:05 【问题描述】:

我在 Chrome 中查看 javascript 控制台并注意到一些奇怪的东西,尽管它们看起来相同,objJSON.parse(JSON.stringify(obj)) 并不相同。这是为什么呢?

var obj = test:'this is a test', another: omg:'ay dios mio', check:true;
console.log(obj, JSON.parse(JSON.stringify(obj)));
console.log(obj == JSON.parse(JSON.stringify(obj)));

它们看起来相同,但在检查相等性时返回 false。这是为什么呢?

【问题讨论】:

不是真的重复,但那里的答案也回答了你的问题。 如果您将两者都转换为字符串JSON.stringify(),那么您会看到它们的值是相等的。 MDN: Equality operators[...]If both operands are objects, then JavaScript compares internal references which are equal when operands refer to the same object in memory. 【参考方案1】:

因为obj 没有引用内存中的已解析对象。所以这是两个不同的声明。如果你这样做:

var a = [ 10 ],
    b = [ 10 ];

然后有 2 个具有相同值的数组实例,但这并不能使它们成为同一个数组。所以a != b,即使10 == 10。您可以将 a[0] 的值增加到 15,但这不会将 b[0] 的值更改为 15。

因此,如果要比较对象,则必须遍历它们并检查对象的值是否相同。

比较函数(借自jQuery object equality)

$.fn.equals = function(compareTo) 
  if (!compareTo || this.length != compareTo.length) 
    return false;
  
  for (var i = 0; i < this.length; ++i) 
    if (this[i] !== compareTo[i]) 
      return false;
    
  
  return true;
;

【讨论】:

但是它们引用的方式是相同的,我可以只使用 1 个属性使其成为对象。没错。 是的(因为数组是对象)。只是,引入更多不相关的因素往往会使解释变得模糊......【参考方案2】:

它们不相等的原因与返回 false 的原因相同:

(omg:'ay dios mio', check:true) == (omg:'ay dios mio', check:true)

您不是在比较对象内部的值,而是在比较对象引用。它们会有所不同。

【讨论】:

【参考方案3】:

对象正在测试 REFERENCES。

当基元测试 VALUE 时。

【讨论】:

以上是关于obj == JSON.parse(JSON.stringify(obj)) 为假 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过JSON.parse(JSON.stringify(obj))转换的对象中的日期(Date)

javascript学习之js对象和json对象(obj=JSON.parse(stu))

JSON.stringify,JSON.parse方法

`JSON.parse(JSON.stringfy())`进行深拷贝方法小结

JSON.stringify()和JSON.parse()

JSON.stringify()和JSON.parse()