Javascript троичный оператор и присваивание - PullRequest
21 голосов
/ 22 февраля 2011

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

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

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

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

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

Ответы [ 4 ]

22 голосов
/ 22 февраля 2011

Результат вычисления var t = 1 == 1 ? 1 : 0; в, скажем, консоли Firebug будет undefined. Однако значение t будет 1, как и ожидалось. Попробуйте вывести t после назначения.

Firebug будет выводить результат, когда объявление переменной находится в отдельной строке:

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

Это потому, что возвращаемое значение операции присваивания является присваиваемым значением. Однако, когда присутствует ключевое слово var, возвращается значение объявления VariableStatement, которое ведет себя следующим образом:

Производство ПеременнаяStatement : var СпискаОбъявленияПеременных ; оценивается следующим образом: оценить СпискаОбъявленияПеременных . Вернуть (обычный, пустой, пустой).

Где Return (normal, empty, empty). относится к типу, распознаваемому внутренне JavaScript, а не к типу, который выводится на консоль.

Дальнейшее чтение:

http://ecma262 -5.com / ELS5_HTML.htm # Section_12.2

10 голосов
/ 22 февраля 2011

Работает отлично:

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

Можно сказать, что возвращаемое значение операции присвоения равно undefined, а не значение t.


Редактировать: Но на самом деле , если я правильно прочитал спецификацию , кажется, что она должна вернуть значение выражения.

Как @ T.J. По словам Краудера, var отвечает за значение undefined. Но это не значит, что вы не должны использовать var. Код, который вы написали, на 100% правильный.

Это больше касается внутренней работы языка, и я думаю, что это не то, что вас интересует. Но за дополнительной информацией обращайтесь к комментариям.

2 голосов
/ 22 февраля 2011

В старых парсерах javascript нам нужно заключить условие в скобки:

var t = (1 == 1) ? 1 : 0;
1 голос
/ 22 февраля 2011

Этот код отлично работает:

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

Проверьте здесь .Показывает 1 .

...