Подтвердить что ты не робот

Использование тернарного оператора с конкатенацией строк

alert("test: "+(1==2)?'hello':'world');

Это должно показать мне 'world' на экране, так как 1 не равно 2.

Как он оповещает 'hello'?

4b9b3361

Ответ 1

Попробуйте обернуть ваши парны вокруг операции

alert("test: "+ (1 == 2 ? 'hello' : 'world'));

demo: http://jsfiddle.net/hunter/K3PKx/


что это делает:

alert("test: "+(1==2)?'hello':'world');

оценивает "test: " + (1==2) как true, который выводит 'hello'

Ответ 2

Оба представленных ответа верны, вам нужно добавить круглые скобки. Я подумал, что кратко поговорю о том, почему.

alert("test: "+(1==2)?'hello':'world');

Когда синтаксический анализатор встречает оператор, он начнет рекурсивно разбивать его на более мелкие и мелкие куски.

В этом случае первое, что он встречает, это функция: alert. Сразу же анализатор будет смотреть на аргументы alert и начать разбор каждого из них по отдельности. Эта функция имеет только один аргумент, "test: "+(1==2)?'hello':'world', что делает его простым первым шагом.

На этом уровне мы можем разбить наше утверждение на ряд бинарных сравнений. Парсеры Javascript образуют двоичные пары слева направо (когда порядок значений операций один и тот же). Наши потенциальные кандидаты "test: ", (1==2), 'hello' и 'world' с операторами +, ? и :. Парсер сначала попытается добавить "test: " и (1==2). Для этого сначала нужно оценить оператор (1==2) (который оценивается как false). Оператор + вызывает конкатенацию со строками и заставляет все примитивные переменные пытаться представить себя как строки. false оценивается как строка "false", создающая оператор "test: false".

Теперь синтаксический анализатор готов оценить первую часть тройки: "test: false"?. В Javascript все непустые строки оцениваются до true, передавая тернарный операторский тест и выбирая первый вариант "hello".

Бросив несколько дополнительных скобок в исходное утверждение:

alert("test: " + ((1 == 2) ? 'hello' : 'world'));

Скажем парсеру, что мы хотим оценить тернарный оператор перед конкатенацией.

Ответ 3

Вам нужно добавить дополнительные скобки:

alert("test: " + ((1 == 2) ? "hello" : "world"));

Ответ 4

Приоритет оператора

Все операторы имеют то, что известно как приоритет. Вот как язык определяет порядок действий. Операторы с более высоким приоритетом будут оцениваться до тех, у кого более низкий приоритет. Порядок операций - это то, что позволяет выполнять выражения в правильном порядке.

Например,

1 + 2 * 3 == 1 + 6 == 7

поскольку * имеет более высокий приоритет, чем +. Без приоритета вы получите

1 + 2 * 3 == 3 * 3 == 9

+ против ?:

В JavaScript оператор + имеет более высокий приоритет, чем оператор ?:. Это означает, что конкатенация будет иметь место до условия в тройной оценке. Это может привести к некоторым странным результатам.

Примечание. Ассоциативная ассоциативность и приоритет могут меняться между языками. Например, в JavaScript оператор ?: является правильным ассоциативным, но левым ассоциативным в PHP. Эти же сравнения будут давать разные результаты между этими языками.

var variable, str;

// Equality operators have higher precedence than ?: but lower than +
// so the below expression breaks down like this:
//   ("A" + variable) !== undefined ? "B" : ("C" + "D")
//   "Aundefined" !== undefined ? "B" : "CD"
//   true ? "B" : "CD"
//   "B"
str = "A" + variable !== undefined ? "B" : "C" + "D";
console.log(str);

// For the same reason as above, you get a strange result here.
// Here how we break it down:
//   ("A" + variable) === undefined ? "B" : ("C" + "D")
//   "Aundefined" === undefined ? "B" : "CD"
//   false ? "B" : "CD"
//   "CD"
str = "A" + variable === undefined ? "B" : "C" + "D";
console.log(str);