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

     2023-02-22     175

关键词:

【中文标题】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 时。

【讨论】:

json.stringify,json.parse方法

varobj={name:‘zhangsan‘,age:‘18‘};/**js对象--->JSON字符串*JSON.stringify(js对象)--转化为-->JSON字符串**/console.log(obj);//Object{name:"zhangsan",age:"18"}console.log(JSON.stringify(obj));//{"name":"zhangsan 查看详情

浅拷贝深拷贝

...; obj3[k]=obj[k]; //================================深拷贝//JSON.parse(JSON.stringify())varobj4=JSON.parse(JSON.stringify(obj));// 递归functionfun(obj)varobj1=;for(letkinobj)if(typeof(obj[k])==="object")obj1[k]=fun(obj[k]);elseobj1[k]=obj[k];returnobj1;varobj5=fun(obj);obj5.a=123;ob... 查看详情

来自localstorage的JSON无法在php中解码

...存储中获取JSON的代码:$items="<script>document.write(JSON.parse(JSON.st 查看详情

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

...shallowObj.arr的值不会被修改,仍然为原值,如下图:JSON.parse()官方解释JSON.stringfy()官方解释JOSN对象中的stringify可以把一个js对象序列化为一个JSON字符串,parse可以把JSON字符串反序列化为一个js对象,通过这两个方法,也可以实现... 查看详情

json.parse()和json.stringify()的区别

...的参数是入下形式:这边就要对我的obj进行转换 JSON.parse(str)是用于从一个字符串中解析出json对象,如varstr=‘{"name":"huangxiaojian","age":"23"}‘注意:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。结果:  ... 查看详情

深拷贝浅拷贝

...拷贝 深拷贝的实现方法1.浅拷贝+递归2.判断类型JSON.parse(JSON转为对象)JSON.stringify(obj)(对象转JSON)  varobj3=JSON.parse(JSON.stringify(obj)) 参考:https://www.jianshu.com/p/56598f2ac42e 查看详情

vue拷贝对象(代码片段)

//直接拷贝letobj1=;letobj2=;obj2复制obj1的数据//深拷贝obj2=JSON.parse(JSON.stringify(obj1))obj1是需要拷贝的对象obj1与obj2都是独立的对象,对obj2对象操作,对obj1没有影响  查看详情

原生js实现json.parse()和json.stringify()(代码片段)

-首先JSON.stringify()是将js对象转换为JSON形式实现思路:通过递归调用,来实现对转换对象Object的深层value进行遍历,利用array的join实现最终字符串拼接functionmyJsonStringify(obj)lettype=typeofobj;if(type!=="object"||type===null)if(/string|undefined|funct 查看详情

js如何实现对json克隆

...sp;obj = [1,2,[3,4,5]]; var objCloned = JSON.parse(JSON.stringify(obj)); console.log(obj); console.log(JSON.stringify(obj)); console.log(objCloned); 【代码来源网络】这种是很简单的克隆。参考技术A简单的复制还是什么 查看详情

json.parse(json.stringify())实现对对象的深拷贝(代码片段)

 JSON.parse(JSON.stringify(obj))我们一般用来深拷贝,其过程说白了就是利用JSON.stringify将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储(对象本身存储的只是一个地址映射... 查看详情

微信小程序页面跳转url传参,对象、数据过长、特殊字符问题

...为对象则需先使用JSON.stringify()进行转换,接收后使用JSON.parse()转为对象.但这样传参有一个问题,当对象数据长度过大时会报错,因为url传参时程序把过长的那段数据给截取掉了,导致数据转换回来时格式不对而报错。2、传递参... 查看详情

json对象实现深度克隆

...'object') vars=JSON.stringify(obj),//系列化对象 newobj=JSON.parse(s);//反系列化(还原) else if(newobj.constructor===Array) newobj.concat(obj); else for(variinobj) newobj[i]=obj[i]; returnnewobj;;这是js深度克隆的一般实现,这儿JSON这个对象为什... 查看详情

深拷贝浅拷贝问题

1varcloneObj=function(obj){2varstr,newobj=obj.constructor===Array?[]:{};3if(typeofobj!==‘object‘){4return;5}elseif(window.JSON){6str=JSON.stringify(obj),//系列化对象7newobj=JSON.parse(str);//还原8}else{9for( 查看详情

简单深拷贝

letobj=c:1,d:()=>obj_=a:1,b:2obj__=a:()=>,b:()=>,c:1_obj=[1,2,3,1]_obj_=1//深拷贝//JSON.parse(JSON.stringify())//局限性://他无法实现对函数、RegExp等特殊对象的克隆//会抛弃对象的const 查看详情

简单深拷贝

letobj=c:1,d:()=>obj_=a:1,b:2obj__=a:()=>,b:()=>,c:1_obj=[1,2,3,1]_obj_=1//深拷贝//JSON.parse(JSON.stringify())//局限性://他无法实现对函数、RegExp等特殊对象的克隆//会抛弃对象的const 查看详情

javascript与php对json的操作

一、JAVASCRIPT:编码:JSON.parse(str)解码:JSON.stringify(obj)二、PHP:编码:json_encode($str)解码:json_decode($obj) 查看详情

深拷贝与浅拷贝复习(代码片段)

...ey]=obj[key];returnobjClone; 借用JSON对象的JSON.stringify和JSON.parsefunctiondeepClone(obj)let_obj=JSON.stringify(obj),objClone=JSON.parse(_obj);returnobjClone 借用JQ的extend方法$.extend([deep],target,object1[,objectN])leta=[0,1,[2,3],4],b=$.extend(true,[],a);a[0]=1;a[2 查看详情

[js]javascript对象与json的互转

varobj=JSON.parse(json);//由JSON字符串转换为JSON对象varjson=JSON.stringify(obj);//将JSON对象转化为JSON字符//此种需下载插件varjson=obj.toJSONString();//将JSON对象转化为JSON字符 查看详情