Нотация Javascript «кортеж»: в чем ее смысл? - PullRequest
25 голосов
/ 26 января 2012

В wtfjs я обнаружил, что следующее является допустимым javascript.

",,," == Array((null,'cool',false,NaN,4)); // true

Аргумент (null,'cool',false,NaN,4) выглядит для меня как кортеж, но в javascript нет кортежей!

Некоторые быстрые тесты в моей консоли javascript дают следующее:

var t = (null,'cool',false,NaN,4); // t = 4
(null,'cool',false,NaN,4) === 4; // true
(alert('hello'), 42); // shows the alert and returns 42

Кажется, что он ведет себя точно так же, как список операторов, разделенных точкой с запятой ;, просто возвращая значение последнего оператора.

Есть ли где-нибудь ссылка, которая описывает этот синтаксис и его семантику?Почему он существует, то есть когда его следует использовать?

Ответы [ 3 ]

34 голосов
/ 26 января 2012

Вы видите эффект оператора запятой .

Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.

Результирующее значение при оценке a,b,c,...,n всегда будет значением самого правого выражения, однако все выражения в цепочке по-прежнему оцениваются (слева направо).

8 голосов
/ 26 января 2012

Как уже объяснено, это поведение вызвано оператором ,. В связи с этим выражение (null,'cool',false,NaN,4) всегда будет иметь значение 4. Итак, у нас есть

",,," == Array(4)

Array(4) - создает новый массив с выделенными 4 элементами. Во время сравнения со строкой этот массив преобразуется в строку, как это было бы с Array(4).toString(). Для массивов toString действует как join(',') метод, вызываемый для этого массива. Таким образом, для пустого массива из 4 элементов объединение будет производить строку ",,,".

2 голосов
/ 26 января 2012

Попробуйте это alert((null,'cool',false,NaN,4)) и тогда вы увидите.

демо

Причина в том, что оператор запятой оценивает все операторы и возвращает последний.

Подумайте об этой строке: a = 1, b = 2, c = 3; он будет запускать каждое выражение, поэтому, по сути, он установит переменные на то, что вы хотите, и вернет последнее значение (в данном случае 3)

...