一个js对象先将其进行JSON.stringify然后进行JSON.parse,得到的对象为什么不和原来的相同?

如题,这是在node中的执行结果:

node.js

或者这样做的意思何在?有一种说法是去掉属性引用?那么问题来了,什么是属性引用?

阅读 6.3k
7 个回答

肯定不相等啦,json parse相当于一个新的对象啦。
对象的判断是否相等需要遍历属性进行比较,即使楼主这样写也是不相等的,

var a={};var b = {}; a==b; // false;

比如我们需要clone一个对象时候json.stringfy 然后 parse也是一个选择。

我们学过C语言的都知道,对象这种类型被称为引用类型,所有的引用类型实际为一个指针,因此所有的引用类型均无法直接比较,除非重载等号

字符串等此类常用对象之所以能进行直接的比较就是因为内部重载了等号操作。

正因为引用类型的本质的是一个指针,即使内容两个完全相同的对象,存储的位置也一定不同,因此指针也一定不同。所以此处一定是不同的。

上面有人说通过遍历比较,这也是不可取的,因为对象的成员也有可能是对象,是没法这样比的。

而最简单的比较方法恰恰就是JSON.stringify,然后比较字符串了。

难道是我眼睛瞎 不是一样的么?

引用类型 不能用==判断相等吧

一样就相同啊?

对象是引用类型,不能直接==比较

而且用JSON.parse之后相当于从新new了一个对象,从引用的角度来说已经不是同一个对象故不相同。

如果一定要比较两个对象是否相同,可以用遍历来做,遍历所有属性并且看值是否相同。
比如

var a={"c":1,"d":2};//要对比的对象
var t=JSON.stringify(a)//字符串格式
var s=JSON.parse(t);//新对象

for(i in a){
  if(a[i]!=s[i]){
    console.info('两个对象存在差异');
  }
}

当然其实这样做是没有实际意义的,因为我们知道这两个对象是有相同属性。

考虑到对象不一定是通过parse得到的,有可能是框架"增强"过,

我以前做的时候是把两个引用对象用stringify转成字符串 之后再判断字符串是否相等,这样简单一些不同循环遍历

俩双胞胎是同一个人?

因为JSON.stringify()JSON.stringify()相当于对象的序列化/反序列化。

就像Java的Serialize/Deserialize,Python的Dump/Load。

为什么要序列化?是为了对象能够存储传输

存储就是将对象保存起来(例如:JSON文件、浏览器本地存储),以便将来可以再次读取、恢复、使用。这使得对象可以进行时间转移。

传输就是将对象从一个系统传到另一个系统(例如:从中国的服务器传到美国的服务器)。这使得对象可以进行空间转移。

不论存储还是传输,等到你把存储的字符串反序列化得到一个对象时,原来的对象可能早就不存在了,所以怎么可能相同?当然也没有必要相同。所以反序列化得到的对象是一个全新的对象。

实际上,序列化/反序列化的目的决定了新旧对象只要保证数据一致就行了,换句话说就是“克隆”。是的,序列化/反序列化就是一种深度恐龙的方法。

推荐问题
宣传栏