访问数组中对象属性时是否需要提前检查指定属性是否存在?
核心结论
如果没有特殊需求,你可以直接访问不存在的属性,JS只会返回undefined,不会抛出错误也不会产生逻辑冲突。
需要做属性存在性检查的场景
只有当你有以下需求时,才需要额外加校验逻辑:
- 你需要区分「属性存在但值为
undefined」和「属性本身不存在」两种场景:直接访问不存在的属性和访问值为undefined的已有属性返回结果完全相同,要区分二者必须做存在性判断。 - 你需要排除原型链继承属性的干扰:直接访问属性时如果对象自身没有对应属性,JS会顺着原型链向上查找并返回原型上的同名属性值,如果你只需要使用对象自身的属性,必须用
obj.hasOwnProperty(prop)做校验。 - 你需要对属性不存在的场景做特殊处理:比如给属性赋默认值、上报异常、跳过当前循环逻辑等,这时候需要先判断属性是否存在再执行对应分支。
补充优化建议
- 可以用ES6+的可选链语法简化代码,同时避免
array1[i]为null/undefined时抛出错误:for(var i = 0; i < array.length; i++) { console.log(array1[i]?.propertyName) } - 要是需要给不存在的属性设置默认值,可以搭配空值合并运算符使用:
array1[i]?.propertyName ?? '默认值' - 调用
hasOwnProperty时更安全的写法是Object.prototype.hasOwnProperty.call(obj, 'propertyName'),可以避免对象自身重写hasOwnProperty方法导致的判断异常。
内容的提问来源于stack exchange,提问作者user8472012
相关产品推荐
相关产品推荐

