alert("test: "+(1==2)?'hello':'world');
Это должно показать мне 'world'
на экране, так как 1 не равно 2.
Как он оповещает 'hello'
?
alert("test: "+(1==2)?'hello':'world');
Это должно показать мне 'world'
на экране, так как 1 не равно 2.
Как он оповещает 'hello'
?
Попробуйте обернуть ваши парны вокруг операции
alert("test: "+ (1 == 2 ? 'hello' : 'world'));
demo: http://jsfiddle.net/hunter/K3PKx/
что это делает:
alert("test: "+(1==2)?'hello':'world');
оценивает "test: " + (1==2)
как true
, который выводит 'hello'
Оба представленных ответа верны, вам нужно добавить круглые скобки. Я подумал, что кратко поговорю о том, почему.
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'));
Скажем парсеру, что мы хотим оценить тернарный оператор перед конкатенацией.
Вам нужно добавить дополнительные скобки:
alert("test: " + ((1 == 2) ? "hello" : "world"));
Все операторы имеют то, что известно как приоритет. Вот как язык определяет порядок действий. Операторы с более высоким приоритетом будут оцениваться до тех, у кого более низкий приоритет. Порядок операций - это то, что позволяет выполнять выражения в правильном порядке.
Например,
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);