Тройной оператор Javascript и назначение
Я получаю неожиданный результат для этого простого оператора присваивания JavaScript:
var t = 1 == 1 ? 1 : 0;
undefined
Я бы ожидал получить 1, назначенный вместо v. Тот же результат, если вы делаете
var t = (1 == 1 ? 1 : 0);
undefined
Может кто-нибудь объяснить, почему это не работает должным образом?
Ответы
Ответ 1
Результат оценки var t = 1 == 1 ? 1 : 0;
в, скажем, в консоли Firebug будет undefined
. Однако значение t
будет 1
, как и ожидалось. Попробуйте вывести t
после назначения.
Firebug напечатает результат, когда объявление переменной находится в отдельной строке:
var t;
t = 1 == 1 ? 1 : 0;
Это связано с тем, что возвращаемое значение операции присваивания является назначаемым значением. Однако, когда присутствует ключевое слово var
, что возвращает значение объявления VariableStatement, которое ведет себя следующим образом:
Производное VariableStatement: varСпискаОбъявленияПеременный; оценивается следующим образом: Оцените СпискаОбъявленияПеременный. Вернуть (нормальный, пустой, пустой).
Где Return (normal, empty, empty).
относится к типу, распознаваемому JavaScript внутри, а не к тому, что будет напечатано на консоли.
Дальнейшее чтение:
http://ecma262-5.com/ELS5_HTML.htm#Section_12.2
Ответ 2
Он отлично работает:
> var t = 1 == 1 ? 1 : 0;
undefined
> t
1
Можно сказать, что возвращаемое значение операции присваивания undefined
, а не значение t
.
Изменить: но на самом деле если я правильно прочитал спецификацию, кажется, что он должен вернуть значение выражения.
Как @T.J. Кроудер упомянул, кажется, что var
отвечает за значение undefined
. Но это не означает, что вы не должны использовать var
. Код, который вы написали, на 100% правилен.
Это больше касается внутренней работы языка, и я думаю, что это не то, что вас интересует. Bur для получения дополнительной информации об этом, посмотрите комментарии.
Ответ 3
Этот код отлично работает:
var t = 1 == 1 ? 1 : 0;
alert (t);
Отметьте здесь. Он показывает 1.
Ответ 4
В старых парсерах javascript нам нужно заключить условие в круглые скобки:
var t = (1 == 1) ? 1 : 0;