我正在修复一些代码,并试图了解正在发生的某些评估。上面写了一个小片段,其中应进行两次评估:
const active = true;
const isPerson = true;
const person1Time = null;
const person2Time = null;
// this one is not working as intended
const original = !active && isPerson ? !person1Time : !person2Time;
console.log("original", original);
// fixed when second evaluation is wrapped in parens
const fix = !active && (isPerson ? !person1Time : !person2Time);
console.log("fixed", fix);
我能够通过将三元评估值括在括号中来将代码固定为所需的结果。我想知道的是-为什么它会这样工作? !active
的计算结果为false,三元数的计算结果为true,而console.log(true && false)
的计算结果为false。也许我对这里有些误解。
答案 0 :(得分:4)
布尔运算符优先于三元运算符。换句话说:
!active && isPerson ? !person1Time : !person2Time;
等效于此:
(!active && isPerson) ? !person1Time : !person2Time;
因此,您获得了不同的结果。
答案 1 :(得分:3)
x && y
)是优先级6。x ? y : z
)是优先级4。!x
)是优先级17。因此,首先对NOT运算符求值,然后对二进制AND求值,最后对三元运算符求值。
答案 2 :(得分:0)
original
正在评估三元运算符左侧的整个条件表达式:!active && isPerson
。 然后基于该表达式的结果-true
或false
-计算正确的结果。