能否在hasOwnProperty参数中使用逻辑运算符批量检查对象属性?
你的写法逻辑错误,并非合法的多属性检查方式
你当前的代码看似能得到预期结果,但本质是逻辑巧合,并没有同时检查两个属性,具体原因如下:
问题出在逻辑与运算符的行为
JavaScript中&&逻辑与运算符的规则是:
- 先计算左侧表达式的值,如果左侧是真值(比如非空字符串
"firstConfig"肯定是真值),则直接返回右侧表达式的值; - 只有左侧是假值时,才返回左侧的值。
所以你的代码里,"firstConfig" && "secondConfig"最终只会返回"secondConfig",相当于你只对process.env做了hasOwnProperty("secondConfig")的检查,完全没验证firstConfig是否存在。
你的测试场景只是巧合命中结果
- 第一次测试时,两个属性都存在,
secondConfig存在,所以hasOwnProperty返回true,!true为false,不抛错,看起来正常; - 第二次测试移除了
secondConfig,hasOwnProperty返回false,!false为true,抛错,看起来也正常。
但只要换个场景就能暴露问题:比如保留secondConfig但删除firstConfig,你的代码不会抛出任何错误,但这时候firstConfig已经缺失了,完全不符合你的校验需求。
正确的多属性检查写法
要同时验证两个属性都存在,需要分别对每个属性调用hasOwnProperty,再用逻辑运算符组合结果:
// 写法1:检查任意一个不存在就抛错 if (!Object.prototype.hasOwnProperty.call(process.env, "firstConfig") || !Object.prototype.hasOwnProperty.call(process.env, "secondConfig")) { throw new Error("firstConfig或secondConfig缺失") } // 写法2:等价的反向判断 if (!( Object.prototype.hasOwnProperty.call(process.env, "firstConfig") && Object.prototype.hasOwnProperty.call(process.env, "secondConfig") )) { throw new Error("firstConfig或secondConfig缺失") }
内容的提问来源于stack exchange,提问作者Tony Dang
相关产品推荐
相关产品推荐

