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);