Node.js逻辑与短路特性解惑:对象缺失属性判断为何无报错?
为什么访问对象缺失属性的length会报错,加了undefined判断却不会?
这本质是JavaScript逻辑与(&&)的短路求值特性在起作用:
- 当
&&左边的表达式结果为false时,JavaScript会直接返回左边的值,完全不会执行右边的表达式。 - 当对象没有某个属性时,访问该属性会得到
undefined,而undefined没有length属性,直接读取会抛出TypeError。
结合你的代码来看:
- 当
value没有blockedRoom属性时,value.blockedRoom !== undefined的结果是false,此时&&后面的value.blockedRoom.length !== 0不会被执行,所以不会报错。 - 直接执行
value.blockedRoom.length !== 0时,value.blockedRoom是undefined,尝试读取它的length属性就会触发错误。
代码示例验证
var value = {accepters: ["id1"], rejecters: [], blockedRoom: []} // 模拟后续操作后blockedRoom属性被移除 value = {accepters: ["id1"], rejecters: []} console.log("blockedRoom check 1:", value.blockedRoom !== undefined && value.blockedRoom.length !== 0) // No Error console.log("blockedRoom check 2:", value.blockedRoom.length !== 0) // Error var accepters = 0; var rejecters = 0; var amongAccepters = false; var amongRejecters = false; var amongBlockers = false; // No Error if (value.accepters !== undefined && value.accepters.length !== 0){ accepters = value.accepters.length; const foundUserAmongAccepters = value.accepters.find( (v) => v.key === key ); if (foundUserAmongAccepters !== undefined) { amongAccepters = true; } } if (value.rejecters !== undefined && value.rejecters.length !== 0) { rejecters = value.rejecters.length; const foundUserAmongRejecters = value.rejecters.find( (v) => v.key === key ); if (foundUserAmongRejecters !== undefined) { amongRejecters = true; } } if (value.blockedRoom !== undefined && value.blockedRoom.length !== 0) { const foundUserAmongBlockers = value.blockedRoom.find((v) => v === key); if (foundUserAmongBlockers !== undefined) { amongBlockers = true; } }
更简洁的写法
现在Node.js(14+)支持ES2020的可选链操作符,可以简化这种空值检查:
// 替代原有的判断逻辑 if (value.blockedRoom?.length !== 0) { // ...你的逻辑 }
可选链?.会在属性不存在时直接返回undefined,不会抛出错误,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Abdullah Isa
相关产品推荐
相关产品推荐

