JSON.parse(JSON.stringify(obj))实现深拷贝的坑

说到JSON.parse(JSON.stringify(obj)),真的是太多的坑了,主要是这个坑你不知道你就完了,这个面试经常被问到,除了把深拷贝的源码写出来就是问JSON.parse(JSON.stringify(obj))的坑了,今天就谈一谈这个该死的坑

其实JSON.parse(JSON.stringify(obj))简而言之就是stringify部分把它冰冻起来,然后pasrse部分给他解冻罢了,但是有些精华的部分就被丢失了。那今天主要找一下那些东西容易被丢失,是蛋白质还是脂肪还是无机盐???

1、JSON.parse(JSON.stringify(obj))的大大小小的坑

(1)、拷贝内容为时间对象时

var obj = {
     
	name:'Mark',
	time: Date.now()
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log('obj:', obj);
console.log('objCopy:', objCopy);
console.log(typeof obj.time); // object
console.log(typeof objCopy.time); // string

输出结果:

JSON.parse(JSON.stringify(obj))实现深拷贝的坑_第1张图片
我们发现:拷贝后的时间对象为String,只是拷贝了形,没有拷贝到魂,所以拷贝后的对象的方法也用不到了。

(2)、拷贝内容为RegExp或是Error

var obj = {
     
	name:'Mark',
	reg: new RegExp('\\w+'),
    err: new Error('error message')
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log('obj:', obj);
console.log('objCopy:', objCopy);

输出结果:
JSON.parse(JSON.stringify(obj))实现深拷贝的坑_第2张图片
这个就很过分了,海参都炒丢了,直接给我来个空对象

(3)、拷贝内容为undefined或是Function

var obj = {
     
	name:'Mark',
	reg: undefined,
    getData: function() {
     
		console.log('我就是JSON')
	}
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log('obj:', obj);
console.log('objCopy:', objCopy);

JSON.parse(JSON.stringify(obj))实现深拷贝的坑_第3张图片
对于拷贝这两个更吓人,直接弄丢了,这才是海参丢了,上面只是面丢了

(4)、拷贝内容为NaNInfinity-Infinity

var obj = {
     
	name:'Mark',
	num: NaN,
    total: Infinity
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log('obj:', obj);
console.log('objCopy:', objCopy);

JSON.parse(JSON.stringify(obj))实现深拷贝的坑_第4张图片

有NaN、Infinity和-Infinity,则序列化的结果会变成null;

(5)、拷贝内容为实例化对象

function Person(age) {
     
	this.age = age
}
 var obj = {
     
	name:'Mark',
	age: new Person(12)
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log('obj:', obj);
console.log('objCopy:', objCopy);
console.log(obj.age.__proto__.constructor === Person); 
console.log(objCopy.age.__proto__.constructor === Object); 

输出结果
JSON.parse(JSON.stringify(obj))实现深拷贝的坑_第5张图片
发现拷贝后constructor丢失,也就是原型链没有拷贝上,拷贝的的age找不到constructor,然后只能指向Object

还有一些其他的情况大家一起去发现吧,下次分享详细版本的深拷贝

你可能感兴趣的:(算法,JS,js)