2

Рассмотрит следующее:
(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 

проблема:


Я знаю, что это легко исправить с помощью фигурных скобок:

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

Вопрос: Почему не || оператора получить укороченный в этом случае ?

Я знаю, что логическое ИЛИ имеют самый низкий приоритет среди двоичных логических условных операторов, но думал, что это имеет более высокую старшинство, чем условный оператор троичного?

Я неправильно читаю MDN docs for Operator precedence?

+4

«более высокий приоритет» означает, что ваш код оценивается как «(шаг || (начало <конец))? 1: -1' –

+0

«Высшее приоритет» означает, что '||' сначала оценивается, т. Е. 'Step || (start Xufox

+0

@NiettheDarkAbsol: это будет означать, что троянец имеет больший приоритет, не так ли? MDN-документы говорят иначе ... – Pineda

ответ

5

Да, оператор || имеет более высокий приоритет, чем условный оператор ?:. Это означает, что он выполняется первым. Со страницы, которую вы нажимаете:

Операторский приоритет определяет порядок, в котором операторы оцениваются. Сначала оцениваются операторы с более высоким приоритетом. (MDN) enter link description here

Давайте посмотрим на все операции здесь:

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

Оператор с наивысшим приоритетом является () группировка операции. Вот это приводит к false:

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

Следующий наивысший приоритет является логическим оператором ИЛИ. step правдиво, поэтому он приводит к step.

step = step ? 1 : -1; 

Теперь мы выполняем тройную операцию, которая остается единственной. Опять же, step правдиво, поэтому выполняется первый из вариантов.

step = 1; 
+1

Я получаю это. То, что я не получаю, - это почему '||' не работает, когда левое условие истинно в этом случае? – Pineda

+2

@Pineda. Его левый операнд - 'step', а его правый операнд -' false'. 'false' никогда не выполняется. – lonesomeday

+0

'step = step || ложный ? 1: -1; 'почему' false? 1: -1' выполняется здесь, а не эквивалентно 'step = step || (false? 1: -1); ' – Pineda

Смежные вопросы