js中有了for...in ,为啥还要再判断hasOwnProperty

for...in循环会遍历对象及其原型链上的可枚举属性。hasOwnProperty方法用于判断属性是否属于对象本身而非原型链。文章讨论了这个知识点在实现深拷贝函数deepClone中的应用,该函数递归复制对象,忽略原型链上的属性。
摘要由CSDN通过智能技术生成

总结:

一句话概括: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;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值