思路:利用递归去遍历每一个引用类型值直到为值类型,然后对值类型进行赋值操作
基本知识:
javascript原生遍历方法的建议用法:
- 用for循环遍历数组
- 用for-in遍历对象
- 用for-of遍历类数组对象(ES6)
- 用Object.keys()获取对象属性名的集合
var arrTmp = [{ aa: "value1", bb: "value2" }, "value2", "value3"];
var obj = {
aa: "value1",
bb: "value2",
dd: {
ee: "value4",
ff: ["1", "2", 3]
}
}
function deepCopy(obj) {
var result;
//引用类型分数组和对象分别递归
if (Object.prototype.toString.call(obj) == '[object Array]') {
result = []
for (i = 0; i < obj.length; i++) {
result[i] = arguments.callee(obj[i])
}
} else if (Object.prototype.toString.call(obj) == '[object Object]') {
result = {}
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
result[attr] = arguments.callee(obj[attr])
}
}
}
//值类型直接返回
else {
return obj
}
return result
}
console.log(deepCopy(arrTmp)); // true
console.log(deepCopy(obj)); // true