### 问题描述

（编辑：我已稍微修改了该功能以删除三元运算符的使用或大括号）

Consider the following:
( I've amended the function slightly to remove the use or braces with the ternary operator)

``````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
``````

``````someFunction(1,10,2)
//step IS defined, shortcut logical OR || should kick in,
//step should return 2 BUT it returns 1
``````

I'm aware that this is easily fixed by using braces:

``````function range(start,end,step){
var start = start || 1,
end = end || 100,
step = step || ((start < end) ? 1:-1);
console.log(step);
}
``````

I'm aware that the Logical OR has the lowest precedence among binary logical conditional operators but thought that it has higher precedence than the conditional Ternary operator?

### 推荐答案

Yes, the `||` operator has higher precedence than the conditional `?:` operator. This means that it is executed first. From the page you link:

Let's have a look at all the operations here:

``````step = step || (start < end) ? 1:-1;
``````

The operator with the highest precedence is the `()` grouping operation. Here it results in `false`:

``````step = step || false ? 1 : -1;
``````

The next highest precedence is the logical OR operator. `step` is truthy, so it results in `step`.

``````step = step ? 1 : -1;
``````

Now we do the ternary operation, which is the only one left. Again, `step` is truthy, so the first of the options is executed.

``````step = 1;
``````

08-16 00:50