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

Тройной оператор Javascript и назначение

Я получаю неожиданный результат для этого простого оператора присваивания JavaScript:

var t = 1 == 1 ? 1 : 0;
undefined

Я бы ожидал получить 1, назначенный вместо v. Тот же результат, если вы делаете

var t = (1 == 1 ? 1 : 0);
undefined

Может кто-нибудь объяснить, почему это не работает должным образом?

4b9b3361

Ответ 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;