JavaScript" кортеж " нотация: в чем ее смысл?

At 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 ответов


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

оператор "запятая" вычисляет оба операнда (слева направо) и возвращает значение второго операнда.

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


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

",,," == Array(4)

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


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

демо

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

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