了解JavaScript评估

时间:2019-12-02 15:31:12

标签: javascript

我正在修复一些代码,并试图了解正在发生的某些评估。上面写了一个小片段,其中应进行两次评估:

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。也许我对这里有些误解。

3 个答案:

答案 0 :(得分:4)

布尔运算符优先于三元运算符。换句话说:

!active && isPerson ? !person1Time : !person2Time;

等效于此:

(!active && isPerson) ? !person1Time : !person2Time;

因此,您获得了不同的结果。

答案 1 :(得分:3)

关注operator precedence rules

  • 二进制AND(x && y)是优先级6。
  • 三元(x ? y : z)是优先级4。
  • 一元NOT(!x)是优先级17。

因此,首先对NOT运算符求值,然后对二进制AND求值,最后对三元运算符求值。

答案 2 :(得分:0)

original正在评估三元运算符左侧的整个条件表达式:!active && isPerson然后基于该表达式的结果-truefalse-计算正确的结果。