总结:
一句话概括:for…in 的遍历范围包括它的原型链
接下来是解释:
var arr = {
a: "lv1",
__proto__: {
b: "lv2",
__proto__: {
c: "lv3",
__proto__: {
c: "lv4",
}
}
}
}
for(const key in arr) {
console.log(key, arr[key])
};
// a lv1
// b lv2
// c lv3
hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
也就意味着原型链上的不算
这个知识点主要用于深拷贝
function deepClone(obj) {
if (typeof obj != 'object') return obj;
var temp = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] == 'object') { // 如果obj[key]还是对象则执行递归
temp[key] = deepClone(obj[key]); // 递归
} else {
temp[key] = obj[key];
}
}
}
return temp;
}