浅克隆
展开运算符
let arr1 = [10,20,{name:'zll'}];
let arr2 = [...arr1]
arr1[2] === arr2[2]
slice
let arr1 = [10,20,{name:'zll'}];
let arr2 = arr1.slice(0)
arr1[2] === arr2[2]
Object.assign
let obj1 = {a:{b:{c:1}}}
let obj2 = Object.assign({},obj1)
obj1.a===obj2.a
obj1.a.b===obj2.a.b
深克隆
JSON
- 如果出现以下内容将会出现问题
- 正则 => 空对象
- function => null
- Date对象 => 日期字符串
let arr1 = [10,20,{name:'zll'}];
let arr2 = JSON.parse(JSON.stringify(arr1))
arr1[2] === arr2[2]
let arr1 = [10,20,/\.css$/];
let arr2 = JSON.parse(JSON.stringify(arr1))
console.log(arr2);
let arr1 = [10,20,function(){}];
let arr2 = JSON.parse(JSON.stringify(arr1))
console.log(arr2);
deepClone方法
function deepClone(obj) {
if(obj === 'null') return null;
if(typeof obj !== 'object') return obj;
if(Object.prototype.toString.call(obj) === '[object RegExp]') return new RegExp(obj);
if(Object.prototype.toString.call(obj) === '[object Date]') return new Date(obj);
let newObj = new obj.constructor;
for(let key in obj) {
if(!obj.hasOwnProperty(key)) break;
newObj[key] = deepClone(obj[key]);
}
return newObj;
}