检查属性存在性需区分自身与继承:用in操作符查原型链(含symbol),object.hasown()查自身属性(安全可靠),兼容旧环境用object.prototype.hasownproperty.call(),避免用undefined比较或直接调用hasownproperty。

检查原型对象上的属性是否存在,关键不是“避开报错”,而是明确你要查的是哪一层:是对象自身?还是它继承来的?不同目的对应不同方法,选错容易误判。
想确认属性是否在原型链上(包括继承的)
用 in 操作符最直接:
- 它会顺着整个原型链往上找,只要某一级有这个属性名,就返回 true
- 比如
'toString' in {}是 true,因为从Object.prototype继承了 - 也支持 Symbol 属性:
Symbol.iterator in []返回 true
想确认属性是否只在对象自身(不查原型)
推荐用 Object.hasOwn():
- 它是
hasOwnProperty的现代替代,行为一致但更安全 - 不会被对象自己定义的同名方法干扰,比如
{ hasOwnProperty: () => false }这种恶意覆盖不影响它 - 兼容性已很好(Chrome 93+、Firefox 92+、Safari 15.4+,Node.js 16.9+)
需要兼容极老环境(如 IE)时的备选
可以用 Object.prototype.hasOwnProperty.call():
- 绕过对象可能重写的
hasOwnProperty方法,确保调用的是原生版本 - 写法略长:
Object.prototype.hasOwnProperty.call(obj, 'prop') - 注意:不能用于
Object.create(null)创建的对象(它没有原型)
不建议的方法
以下方式容易出错,应避免:
-
obj.prop !== undefined:属性值本身就是undefined时会误判 -
typeof obj.prop !== 'undefined':同样无法区分“属性存在但为undefined”和“属性根本不存在” - 直接调用
obj.hasOwnProperty('prop'):如果对象自己定义了该方法,结果不可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











