Примите во внимание следующее:
(EDIT: я немного изменил функцию, убрав использование фигурных скобок с тернарным оператором)
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
Я знаю, что это легко исправить с помощью фигурных скобок:
function range(start,end,step){
var start = start || 1,
end = end || 100,
step = step || ((start < end) ? 1:-1);
console.log(step);
}
Вопрос: Почему в этом случае оператор
||
не работает?Я знаю, что логическое ИЛИ имеет самый низкий приоритет среди бинарных логических условных операторов, но думал, что он имеет более высокий приоритет, чем условный тернарный оператор?
Я неправильно понимаю документацию MDN по приоритету операторов?
(step || (start < end)) ? 1 : -1
- person Niet the Dark Absol   schedule 03.02.2017||
оценивается первым, т. е.step || (start < end)
оценивается первым. - person Sebastian Simon   schedule 03.02.2017step || (start < end) ? 1 : -1
оценивается какstep ? 1 : -1
, потому что||
оценивается первым, аstep
соответствует действительности. Затемstep ? 1 : -1
оценивается как1
, потому чтоstep
соответствует действительности. - person Sebastian Simon   schedule 03.02.2017||
не выполняет ярлык, см. ответ @lonesomeday. Я отредактировал это сейчас, чтобы уточнить. - person Pineda   schedule 03.02.2017