说到
JSON.parse(JSON.stringify(obj))
,真的是太多的坑了,主要是这个坑你不知道你就完了,这个面试经常被问到,除了把深拷贝的源码写出来就是问JSON.parse(JSON.stringify(obj))
的坑了,今天就谈一谈这个该死的坑
其实JSON.parse(JSON.stringify(obj))
简而言之就是stringify
部分把它冰冻起来,然后pasrse
部分给他解冻罢了,但是有些精华的部分就被丢失了。那今天主要找一下那些东西容易被丢失,是蛋白质还是脂肪还是无机盐???
JSON.parse(JSON.stringify(obj))
的大大小小的坑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
输出结果:
我们发现:拷贝后的时间对象为String,只是拷贝了形,没有拷贝到魂,所以拷贝后的对象的方法也用不到了。
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);
输出结果:
这个就很过分了,海参都炒丢了,直接给我来个空对象
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);
对于拷贝这两个更吓人,直接弄丢了,这才是海参丢了,上面只是面丢了
NaN
、Infinity
和-Infinity
var obj = {
name:'Mark',
num: NaN,
total: Infinity
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log('obj:', obj);
console.log('objCopy:', objCopy);
有NaN、Infinity和-Infinity,则序列化的结果会变成null;
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);
输出结果
发现拷贝后constructor
丢失,也就是原型链没有拷贝上,拷贝的的age
找不到constructor
,然后只能指向Object
还有一些其他的情况大家一起去发现吧,下次分享详细版本的深拷贝