优先级:逻辑或三元运算符

Pin*_*eda 2 javascript ternary-operator operator-precedence logical-or

请考虑以下内容:(
编辑:我稍微修改了函数以删除三元运算符的使用或括号)

function someFunction(start,end,step){
  var start = start || 1,
      end = end || 100,
      boolEndBigger = (start < end);   // define Boolean here
      step = step || boolEndBigger ? 1:-1;
  console.log(step); 
}

someFunction()
// step isn't defined so expect (1<10) ? 1:-1  to evaluate to 1

someFunction(1,10)  
// again step isn't defined so expect to log 1 as before
Run Code Online (Sandbox Code Playgroud)

问题:

someFunction(1,10,2) 
//step IS defined, shortcut logical OR || should kick in, 
//step should return 2 BUT it returns 1
Run Code Online (Sandbox Code Playgroud)

我知道使用大括号可以很容易地解决这个问题:

function range(start,end,step){
  var start = start || 1,
      end = end || 100,
      step = step || ((start < end) ? 1:-1);
  console.log(step); 
}
Run Code Online (Sandbox Code Playgroud)

问题:||在这种情况下, 为什么运营商不能做空?

我知道Logical OR在二进制逻辑条件运算符中具有最低优先级,但认为它具有比条件Ternary运算符更高的优先级

我是否误读了运营商优先级MDN文档

lon*_*day 8

是的,||运算符的优先级高于条件?:运算符.这意味着它首先被执行.从您链接的页面:

运算符优先级确定运算符的计算顺序.首先评估具有更高优先级的运算符.(MDN)在此输入链接描述

我们来看看这里的所有操作:

step = step || (start < end) ? 1:-1;
Run Code Online (Sandbox Code Playgroud)

优先级最高的运算符是()分组操作.这导致false:

step = step || false ? 1 : -1;
Run Code Online (Sandbox Code Playgroud)

下一个最高优先级是逻辑OR运算符.step是真实的,所以它导致step.

step = step ? 1 : -1;
Run Code Online (Sandbox Code Playgroud)

现在我们进行三元运算,这是唯一剩下的运作.再次,step是真的,所以第一个选项被执行.

step = 1;
Run Code Online (Sandbox Code Playgroud)

  • @Pineda确实如此.它的左操作数是`step`,右操作数是`false`.`false`永远不会执行. (2认同)
  • @Pineda 是的,右侧 * 到下一个运算符 * 是操作数,而不是右侧的所有内容。想想 `5 + 2 * 3 + 4` 是如何执行的。`*` 的优先级高于 `+`,因此首先执行 `2*3`。 (2认同)