为何两个判断error.message的JS表达式执行结果不符预期?
问题原因
核心错误是逻辑转换时违反了德摩根定律,把逻辑连接符写错了,导致简写后的表达式和原逻辑完全不等价。
逐段逻辑拆解
首先化简你最初写的正确版本的逻辑:
你写的三元表达式:
console.log( error.message === 'user_not_found' || error.message === 'password_missing_onboarding_incomplete' ? false : true );
本质是对(A || B)的结果取反,其中:
- A =
error.message === 'user_not_found' - B =
error.message === 'password_missing_onboarding_incomplete'
也就是说原逻辑等价于!(A || B)。
根据德摩根定律,对或运算的结果取反,等价于对每个条件分别取反后,再做与运算,转换规则为:
!(A || B) === !A && !B
你写的错误简写版用||(或运算)连接两个取反后的条件,写出来的是!A || !B,和正确转换规则完全不符。
代入场景验证
以你给出的error.message = 'user_not_found'场景为例,计算错误简写版的返回值:
- 第一个条件
error.message !== 'user_not_found':结果为false(当前值确实是user_not_found) - 第二个条件
error.message !== 'password_missing_onboarding_incomplete':结果为true(当前值不是后者) - 或运算只要有一个条件为真就返回真,所以
false || true = true,和你实际运行的结果一致。
额外说明:你写的错误简写是个恒真表达式——因为error.message不可能同时等于两个不同的字符串,不管它是什么值,两个!==判断里永远至少有一个为真,整个表达式永远返回true,完全起不到分支判断的作用。
正确简写方式
把两个条件之间的||换成&&即可,和原逻辑完全等价:
console.log(error.message !== 'user_not_found' && error.message !== 'password_missing_onboarding_incomplete');
内容的提问来源于stack exchange,提问作者Onyx
相关产品推荐
相关产品推荐

