JavaScript检测对象属性存在且等于特定值的两种写法哪个更安全?
两种JavaScript属性判断写法的对比分析
我们基于示例对象let obj = {name: 'firstName'}展开分析:
写法1:if (obj.address === 'someAddress')
优势
- 代码简洁无冗余,逻辑直观
- 不存在假值误判:不管
obj.address返回什么值,都会和目标值做严格相等比较,只要值匹配就会判定为真,哪怕目标值是空字符串、0这类假值也能正常判断
劣势
- 没有对象合法性兜底:如果
obj本身是undefined或者null(比如接口返回空、变量未正确赋值的场景),直接访问obj.address会抛出Uncaught TypeError: Cannot read properties of undefined (reading 'address'),直接阻塞后续代码执行
核心原理
普通对象访问不存在的属性会返回undefined,undefined和任意非undefined类型的值做严格相等比较都会返回false,因此只要能保证obj一定是合法对象,这个写法的判断结果是完全准确的。
写法2:if (!!obj.address && obj.address === 'someAddress')
优势
- 做了真值前置判断:当
obj.address是undefined、null等空值时,会直接中断判断逻辑,一定程度上减少后续运算 - 大部分常规业务场景(匹配的目标值为非假值的字符串、对象等)下判断结果符合预期
劣势
- 依然存在报错风险:和第一种写法一样,没有对
obj本身的合法性做判断,只要obj是undefined/null就会抛出类型错误 - 存在假值误判问题:如果需要匹配的目标值本身是JS假值(比如空字符串
''、数字0、布尔值false等),前置的!!obj.address会直接返回false,永远不会进入后续的相等比较,导致逻辑bug
核心原理
!!的作用是将任意值强制转为布尔类型,JS中undefined、null、false、0、''、NaN都属于假值,经过!!转换后都会得到false,因此当目标匹配值属于假值范畴时,前置判断会直接拦截掉正确的匹配逻辑。
更优的通用解决方案
如果是支持ES2020+语法的环境,推荐使用可选链运算符的写法:if (obj?.address === 'someAddress')
该写法同时解决了两种传统写法的缺陷:
- 当
obj是undefined/null时,可选链会直接返回undefined,不会抛出类型错误 - 没有多余的真值判断,不会出现假值误判问题,所有值都会正常做严格相等比较
内容的提问来源于stack exchange,提问作者JerryThePineapple
相关产品推荐
相关产品推荐

