// 原数组
let list=[1,2,3,4];
//数组深拷贝
let box = list.slice();//方案一
let box = [].concat(list); //方案二
let box = [...list];//方案三
let box = Array.from(list);//方案四
//对象深拷贝(问题:若属性未对象或引用,则只会拷贝对象的引用地址)
let B = Object.assign({},A);
//对象深拷贝,方案1
//若对象中存在function或RegExp则不能使用该方法
let B = JSON.parse(JSON.stringify(A));
//对象深拷贝,方案2-使用递归
var clone = function (obj) {
if(obj === null) return null
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(obj);
if(obj.constructor === RegExp) return new RegExp(obj);
var newObj = new obj.constructor (); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
var val = obj[key];
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
};
参考
JavaScript深拷贝和浅拷贝看这篇就够了 Shallow Vs Deep Copy In Javascript Understanding Deep and Shallow Copy in Javascript