2016-03-11 2 views
6

Я делаю небольшую утилиту для компиляции блока JavaScript с использованием C#. Я пытаюсь понять поток выполнения тернарного оператора. Теперь, когда я бегу JavaScript с помощью Chrome или Firefox:Результат ternary оператора Javascript

var k = 27; 
var o = 78; 
var a = k < 100 ? o+=2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

Он должен дать мне результат "T" или "F" если "о + = 2" возвращает ложь. Но вместо них он возвращает «78F». Может кто-нибудь, пожалуйста, объясните мне, в чем логика этого.

+11

Я рекомендовал бы НЕ гнездования тройные операторов. Хотя всегда приятно иметь один-лайнер, намного легче понять другим разработчикам, если вы разделите это на инструкции if-else. Мне когда-то приходилось работать над приложением с до шести вложенными тройниками по частям.Это было зверь для отладки. – HockeyJ

+1

используйте фигурные скобки '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Это, скорее всего, даст вам и желаемый результат. – Aukhan

+1

Вложенные троицы - страшная идея. – rlemon

ответ

9

На основе operator precedence table:

операторы присваивания имеет меньший приоритет, чем оператор сравнения.

Так что ваш код будет оцениваться, как показано ниже,

  1. вар а = к < 100? o + = 2> 11? «T»: «F»: o < 100? «J»: «P»;
  2. var a = true? o + = 2> 11? «T»: «F»: o < 100? «J»: «P»;
  3. var a = true? o + = false? «T»: «F»: o < 100? «J»: «P»;
  4. var a = true? o + = "F": o < 100? «J»: «P»;
  5. var a = true? "78F": o < 100? «J»: «P»;
  6. вар а = "78F"

И вы можете исправить поведение, группируя условие, используя круглые скобки,

var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P"; 
console.log(a); // T 
1

Вы используете += на o вместо просто +.

var a = k < 100 ? o+2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 

Также с помощью круглых скобок сделает его более удобным для чтения:

var a = (k < 100 ? (o+2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P")); 
3
var k = 27; 
var o = 78; 
var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

Приведенный выше код работает, как ожидалось вами. Вы, наверное, подумали, что сначала будет обработан оператор +=.

1

Это на самом деле работает как k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");

, потому что что-то на правой стороне оператора присваивания = обрабатывается первым, в порядке слева направо, так 2 > 11 ? "T" : "F" оценивается первый

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

  • Нет связанных вопросов^_^