如何在对象本身可能未定义的情况下判断该对象上的属性是否存在
正确判断属性存在的方案(包括对象本身未定义的场景)
- ES2020+ 最简方案(推荐)
使用可选链操作符?.即可避免对象未定义时抛出的引用错误:
let exists = myObject?.myProperty !== undefined;
可选链的逻辑是:如果左侧的myObject为undefined或null,会直接返回undefined,不会尝试读取后续的myProperty,自然不会抛出报错。
- 兼容旧JS环境的方案
如果运行环境不支持ES2020的可选链,可以先通过typeof判断对象本身是否存在,再判断属性:
let exists = typeof myObject !== 'undefined' && myObject.myProperty !== undefined;
typeof对未声明的变量会直接返回undefined,不会抛出引用错误,符合安全判断的要求。
- 需要判断属性为对象自身属性的场景
如果需要排除原型链上的同名属性,建议结合hasOwnProperty方法:
// ES2020+ 版本 let exists = myObject?.hasOwnProperty('myProperty') ?? false; // 兼容旧版本 let exists = typeof myObject !== 'undefined' && myObject.hasOwnProperty('myProperty');
注意:如果属性本身的值就是
undefined(比如let obj = {a: undefined}),用!== undefined的方式会误判为属性不存在,这种场景建议用in操作符或者hasOwnProperty来判断。
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

