- 注:有的时候我们需要从栈中开辟一道新的路径时,进行深拷贝数据
/**
* 定义了一个新的obj数据
*/
let obj = {
num : 10,
str : 'string',
arr : [1,2,3,4],
arr2 : {a:'1'}
};
/**
* 同理我们把新的数据赋予给了 newObj
* 但是我们的数据的路径是与obj 的路径一致的
*/
// 如一下操作
let newObj = obj
console.log(newObj === obj);
// 输出结果 为 true
- 那么当我们需要重新复制一个数据的时候我们就应该用到 递归遍历了
function deepCopy(obj, newObj) {
for (var key in obj) {
// hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键
if (obj.hasOwnProperty(key)) {
var objValue = obj[key];
// instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,同样也是java中的二元运算符
if (!(objValue instanceof Object)) {
newObj[key] = objValue;
} else {
var temp = new objValue.constructor;
//递归,一直到最后一层也是值类型
deepCopy(objValue, temp);
newObj[key] = temp;
}
}
}
}
var obj = {
num: 10,
str: 'string',
arr: [1, 2, 3, 4],
arr2: { a: '1' }
};
var newObj = {};
deepCopy(obj, newObj)
console.log(newObj === obj);
//输出结果为flase