1.JSON.stringfy()和JSON.parse()
但是这种方法有其局限性,当值为undefined
、function
、symbol
会在转换过程中被忽略
var copy = JSON.parse(JSON.stringify(obj))
2. 递归函数
function deepCopy(obj) { var result = Array.isArray(obj) ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === ‘object‘ && obj[key]!==null) { result[key] = deepCopy(obj[key]); //递归复制 } else { result[key] = obj[key]; } } } return result; }
1 function deepClone (obj) { 2 if (obj === null) return null 3 if (typeof obj !== ‘object‘) return obj; 4 if (obj.constructor === Date) return new Date(obj); 5 var newObj = new obj.constructor(); //保持继承链 6 for (var key in obj) { 7 if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性 8 var val = obj[key]; 9 newObj[key] = typeof val === ‘object‘ ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合 10 } 11 } 12 return newObj; 13 }