浅克隆
浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.
ES5
数组克隆
限制性比较大,一维数组,deep为1
Array.prototype.clone = function(){
let a=[];
for(let i=0,l=this.length;i<l;i++) {
a.push(this[i]);
}
return a;
}
concat
let arr1 = arr.concat()
slice
let arr2 = arr.slice(0)
ES6(数组,对象通用)
扩展符
let arr3 = [...arr];
assign
let arr3 = Object.assign([],arr);
函数方式实现
function shallowClone(obj) {
let cloneObj = {};
for (let i in obj) {
cloneObj[i] = obj[i];
}
return cloneObj;
}
深克隆(通用)
深克隆与浅克隆的区别就是,浅克隆不会克隆原对象中的引用类型,仅仅拷贝了引用类型的指向。深克隆则拷贝了所有。也就是说深克隆能够做到原对象和新对象之间完全没有影响
JSON
无法对函数,正则等特殊对象进行复制 会抛弃对象的constructor,所有的构造函数会指向Object
JSON.parse(JSON.stringfy(arr))
通用克隆
function deepCopy(obj) {
if (typeof obj === 'object') {
var result = obj.constructor === Array ? [] : {};
for (var i in obj) {
result[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i];
}
} else {
var result = obj;
}
return result;
}