Сумма в JavaScript с помощью троичного оператора

#javascript

#javascript

Вопрос:

Ну, я считаю себя довольно хорошим программистом, но JavaScript всегда развлекает меня чем-то новым…

Вот три фрагмента ниже —

  1. Фрагмент 1: я пытаюсь получить встроенное суммирование двух значений на основе некоторого условия, используя троичное сокращение. Этот фрагмент дает мне сумму как ‘X’ = 0 для всех условий.
  2. Фрагмент 2: когда я разделяю это на две суммы, я получаю правильные результаты.
  3. Фрагмент 3: когда я использую фрагмент 1 со скобками вокруг двух сумм, я получаю правильные результаты.

Я понимаю, почему фрагменты 2 и 3 работают, но я не понимаю, почему фрагмент 1 не работает. Кто-нибудь может мне это объяснить? Пожалуйста.

  let w = 50;
  
  // Snippet 1
  for(let i=0;i<4;i  ){   
    let x = w*2*i   (i<2)?w*0:w*2;
    console.log("t",i,x); 
  }

  // Snippet 2
 for(let i=0;i<4;i  ){  
    let x1 = w*2*i;
    let x2 = (i<2)?w*0:w*2;
    let x = x1 x2;
    console.log("t",i,x); 
  }

  // Snippet 3
  for(let i=0;i<4;i  ){   
    let x = (w*2*i)   ((i<2)?w*0:w*2);
    console.log("t",i,x); 
  }  

Комментарии:

1. первый (w*2*i (i<2))?w*0:w*2 — это проверка приоритета оператора — троичный оператор имеет более низкий приоритет, чем арифметические операторы, такие как , -, * и т. Д. — Кстати, этот приоритет оператора не является уникальным для javascript — другие языки ?: ведут себя одинаково (например, C, Java и т. Д.)

2. Все, что находится перед ? , сгруппировано. Вы, вероятно, имели в виду (i < 2 ? w * 0 : w * 2); (как используется во фрагменте 3 — скобки вокруг (i < 2) здесь излишни).

3. @ggorlen Я полностью пропустил это. Я глуп. официально. Теперь я понял, почему это не работает. Да, я понимаю приоритет оператора и троичный оператор, имеющий более низкий приоритет, чем арифметическая операция, но ваши рассуждения здесь имеют больше смысла.

Ответ №1:

Это связано с приоритетом оператора. Условный оператор имеет более низкий приоритет (4), чем сложение / конкатенация (14), поэтому строка здесь:

 let x = w*2*i   (i<2)?w*0:w*2;
  

эквивалентно:

 let x =  w*2*i   (i<2)  ?w*0:w*2;
let x = (w*2*i   (i<2)) ?w*0:w*2;
  

вместо того, чтобы, как вы ожидаете:

 let x = w*2*i    (i<2)?w*0:w*2;
let x = w*2*i   ((i<2)?w*0:w*2); // incorrect
  

Во фрагментах 2 и 3 ваши явные () круглые скобки вокруг условного выражения или разделение условного выражения на отдельную переменную сначала устраняют проблему.