# 深浅拷贝
# 浅拷贝
只拷贝基本类型的数据和指向引用类型的在栈内存中的地址指针,而不拷贝对象在堆中的内存。
浅拷贝的方式: 变量赋值即是浅拷贝
# 深拷贝
深拷贝它会创造一个一模一样的独立的对象,在堆内存中的空间也是独立的两份。深拷贝的实现原理就是递归调用浅拷贝。
# 几个带有拷贝功能的函数
concat()、slice()、splice():
如果数组的项不包含对象的话,就是深拷贝;如果数组中有对象的话,就是浅拷贝。
Object.assign()、Object.create():
如果对象只有一层,就是深拷贝。如果对象有多层,就是将第一层深拷贝,之下的为浅拷贝。
JSON.parse():
JSON对象的序列化和反序列化也可以实现深拷贝。
但是只对基本类型和数组、对象等满足json数据格式的数据有作用,对正则、function等无效。
# 自己实现浅拷贝
//浅拷贝
var shallowCopy = function(obj){
//不拷贝基本类型
if(typeof obj !== 'object'){
return;
}
var new_obj = obj instanceof Array ? []:{};
for(var key in obj){
if(obj.hasOwnProperty(key)){
new_obj[key] = obj[key];
}
}
return new_obj;
}
# 自己实现深拷贝
//深拷贝:递归
var deepCopy = function(obj){
if(typeof obj !== 'object'){
return;
}
var new_obj = obj instanceof Array ?[]:{};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
new_obj[key]=(typeof obj[key] === "object")?deepCopy(obj[key]):obj[key];
}
}
return new_obj;
}
备注:以上的实现方式不支持函数和正则的深拷贝
← JavaScript宽高和偏移 详解深拷贝 →