Javascript hasOwnProperty 方法 & in 关键字

  1.     /**
  2.     * hasOwnProperty :如果 object 具有指定名称的属性,那么方法返回 true;反之则返回 false。
  3.     *此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。
  4.     *in 操作检查对象中是否有名为 property 的属性。也可以检查对象的原型,判断该属性是否为原型链的一部分。
  5.     *
  6.     */
  7.     
  8.     
  9.     function Test(){
  10.         this. a= 'abc';
  11.     }
  12.     Test.prototype.b='efg';
  13.     var test=new Test;
  14.     alert(test.hasOwnProperty('a'));//输出 true
  15.     alert(test.hasOwnProperty('b'));//输出 false
  16.     alert('a' in test);//输出 true
  17.     alert('b' in test);//输出 true
JavaScript 中,检查对象是否包含某个特定键(属性名)有几种常用方法,具体如下: ### 方法一:使用 `hasOwnProperty()` `hasOwnProperty()` 是 `Object.prototype` 上定义的方法,用于检测对象是否具有指定的**自有属性**(不包括原型链上的属性): ```javascript const obj = { name: '张三', age: 22 }; console.log(obj.hasOwnProperty('name')); // true console.log(obj.hasOwnProperty('gender')); // false ``` 此方法仅检查对象自身的属性,不会查找原型链中的属性[^4]。 --- ### 方法二:使用 `in` 运算符 `in` 运算符用于检查某个属性是否存在于对象及其原型链中: ```javascript const obj = { name: '张三', age: 22 }; console.log('name' in obj); // true console.log('toString' in obj); // true(来自原型链) ``` 与 `hasOwnProperty()` 不同,`in` 会包含对象从原型链继承来的属性[^1]。 --- ### 方法三:比较属性值是否为 `undefined` 可以通过判断属性值是否为 `undefined` 来间接判断属性是否存在: ```javascript const obj = { name: '张三' }; if (obj.age === undefined) { console.log('obj 没有 age 属性'); // 输出该语句 } ``` 这种方式在某些情况下容易出错,比如属性值本身为 `undefined` 时,可能导致误判[^3]。 --- ### 方法四:结合 `Object.keys()` 检查键是否存在 可以使用 `Object.keys()` 获取对象的所有键,并使用数组方法检查是否存在: ```javascript const obj = { name: '张三', age: 22 }; console.log(Object.keys(obj).includes('name')); // true console.log(Object.keys(obj).includes('gender')); // false ``` 该方法仅检查对象自身的可枚举属性,不涉及原型链[^2]。 --- ### 方法五:使用 `Reflect.has()` `Reflect.has()` 是 ES6 提供的方法,功能与 `in` 运算符类似,可用于检查对象或其原型链是否包含某个属性: ```javascript const obj = { name: '张三' }; console.log(Reflect.has(obj, 'name')); // true console.log(Reflect.has(obj, 'toString')); // true(来自原型链) ``` 该方法适用于需要更灵活操作对象属性的场景。 --- ### 总结与选择建议 - 若需**仅检查对象自身的属性**,推荐使用 `hasOwnProperty()` 或 `Object.keys().includes()`。 - 若需**同时检查原型链上的属性**,可使用 `in` 或 `Reflect.has()`。 - 避免使用 `obj.property === undefined` 的方式,容易导致误判。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值