将下面代码拷贝到html的<script></script>标签中,执行deepClone(person,person1);
// 目标:将person拷贝到person1
// 源对象
var person = {
name:"dali", // 原始值,直接拷贝 ,栈内存拷贝
age: 40, // 原始值,直接拷贝
card:["master","mazilla"], // 引用值,栈内存拷贝,只是拷贝的是地址
wife:{ // 引用值 Object
name:"lucy",
age: 41,
son: {
name: "feng",
age: 12
}
},
say: function () { // 引用值 function
console.log("oh,my god!!!");
}
}
var person1 = {};
// 遍历对象 for (var prop in obj) {} -->也可以遍历数组(数组是个特殊类型的list对象)
// 1.判断是否是原始值 typeof() obj 引用值
// 2.判断是数组还是对象 三种方法: 1) instansof : 跨父子域有问题 返回false 2) toString 3) constructor : 跨父子域有问题 返回false
// 3.建立相应的数组或对象
// 递归
function deepClone(origin, target) {
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[Object Array]"; // 数组比对
for (var prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (origin[prop] !== "null" && typeof(origin[prop]) == "Object" ) { // 判断是否是引用值
if (toStr.call(origin[prop]) == arrStr) { // 判断是数组的场合
target[prop] = []; // 建立数组对象
} else {
target[prop] = {}; // 建立对象
}
deepClone(origin[prop], target[prop]); // 递归
} else {
target[prop] = origin[prop]; // 原始值,直接拷贝
}
}
}
return target;
}
注意:上述方法中,判断原始值,引用值的时候,可以用三目运算符进行实现
if (toStr.call(origin[prop]) == arrStr) { // 判断是数组的场合
target[prop] = []; // 建立数组对象
} else {
target[prop] = {}; // 建立对象
}
-->
target[prop] = toStr.call(origin[prop] == arrStr) ? [] : {};