基础知识:
hasOwnProperty(propertyName)方法
作用:检测属性是否为对象的自有属性,如果是,返回true,否者false;
参数propertyName指要检测的属性名;
注意:hasOwnProperty() 只会检查对象的自有属性,对象原型上的属性其不会检测;
代码实现:
function deepCopy(obj) { if(typeof obj !== 'object') return let newObj = obj instanceof Array ? [] : {} for(let key in obj) { if(obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key] } } return newObj } let jack = { name : "jack.ma", age:40, like:{ dog:{ color:'black', age:3, }, cat:{ color:'white', age:2 } } } let jack2 = deepCopy(jack) // 比如修改 jack2 中的内容,不会影响到 jack 中的值 jack2.like.dog.color = 'green' console.log(jack.like.dog.color) // 打印出来的应该是 "black"
难以理解的地方:
这里我举了一个例子来理解 hasOwnProperty
例子:如果你给对象的对象原型上额外绑定属性d,然后再遍历输出对象,你会发现对象原型上的属性也会被输出。因此,为了避免这种情况的发生,我们需要采用 hasOwnProperty 来仅选中对象本身自带的属性。
let p1 = { a: 1, b: 2, c: 3 } p1.__proto__.d = 4 for(let key in p1) { console.log(key + ':' + p1[key]) } /** * a:1 * b:2 * c:3 * d:4 */