JSON.parse(JSON.stringify(object))深拷贝的局限
大部分情况我们都可以使用JSON.parse(JSON.stringify(object))来实现深拷贝,但该方法也有局限性,如下:
- 会忽略 undefined
- 会忽略 symbol
- 不能序列化函数
- 不能解决循环引用的对象
例如:
let a = {
age: undefined,
sex: Symbol('female'),
jobs: function() {},
name: 'wzy'
}
let b = JSON.parse(JSON.stringify(a))
console.log(b) // {name: "wzy"}
简易版的深拷贝
var extendCopy = (function f(p,c){
var c = c || {};
for (var i in p) {
if(typeof p[i] === 'object'){
c[i] = (p[i] instanceof Array) ? [] : {};
f(p[i],c[i]);
}else{
c[i] = p[i];
}
}
return c;
});
lodash 的深拷贝函数
语法:_.cloneDeep(value)
var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
相关文章:
Javascript 面向对象编程(一):封装
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承