JavaScript中if (value in item)与item.hasOwnProperty(value)是否等价?
in操作符 vs hasOwnProperty:完全不等价! 嘿,这俩语句绝对不是一回事,我当初刚摸JS的时候也因为没搞清楚这俩的区别踩过不少坑,难怪你会遇到奇怪的结果!下面给你掰扯清楚核心差异:
1. 检查范围天差地别
value in item:会检查整个原型链,包括对象自身的属性,以及从父类/原型继承来的所有属性(比如toString、hasOwnProperty这些Object原型上的方法)。item.hasOwnProperty(value):只检查对象自身拥有的属性,完全无视原型链上继承来的内容。
2. 直接看代码例子更直观
举个最常见的场景,普通对象继承了Object原型的属性:
const myObj = { username: "Alice" }; // 'toString' 是Object原型自带的方法,不是myObj自己的 console.log('toString' in myObj); // 输出 true console.log(myObj.hasOwnProperty('toString')); // 输出 false
再看如果对象自己覆盖了原型属性的情况:
const myObj = { username: "Alice", toString: () => "Custom String" }; // 此时toString是myObj自身的属性,所以两个都返回true console.log('toString' in myObj); // true console.log(myObj.hasOwnProperty('toString')); // true
3. 什么时候用哪个?
- 如果你只关心对象自己定义的属性(比如遍历对象时不想拿到继承来的方法),一定要用
hasOwnProperty。 - 如果你需要确认某个属性(不管是自己的还是继承的)是否存在于对象的可访问范围内,才用
in操作符。
你遇到的奇怪结果,大概率是in把原型链上的继承属性当成了对象自身的属性,导致判断逻辑出错。比如你以为检查的是自己定义的某个属性,结果原型上刚好有同名属性,in就返回true了,但hasOwnProperty会正确返回false。
内容的提问来源于stack exchange,提问作者Tarto
相关产品推荐
相关产品推荐

