Обозначение "tuple" в Javascript: в чем его смысл?
В 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
Похоже, что он ведет себя точно так же, как разделенный запятой ;
список операторов, просто возвращающий значение последнего оператора.
Есть ли ссылка где-нибудь, описывающая этот синтаксис и его семантику? Почему он существует, т.е. Когда он должен использоваться?
Ответы
Ответ 1
Вы видите эффект запятой.
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Полученное значение при оценке a,b,c,...,n
всегда будет значением самого правого выражения, однако все выражения в цепочке все еще оцениваются (слева направо).
Ответ 2
Как уже объяснялось, это поведение вызвано оператором ,
. Вследствие этого выражение (null,'cool',false,NaN,4)
всегда будет оцениваться до 4
. Итак, мы имеем
",,," == Array(4)
Array(4)
- создает новый массив с выделенными 4 элементами. Во время сравнения со строкой этот массив преобразуется в строку, как это было бы с Array(4).toString()
. Для массивов toString
действует как метод join(',')
, вызываемый в этом массиве. Итак, для пустого массива из 4 элементов join будет вызывать строку ",,,"
.
Ответ 3
Попробуйте alert((null,'cool',false,NaN,4))
, а затем вы увидите.
демонстрация
Причина в том, что оператор запятой оценивает все утверждения и возвращает последний.
Подумайте об этой строке: a = 1, b = 2, c = 3;
он будет запускать каждое выражение, поэтому по существу оно будет устанавливать переменные на то, что вы хотите, и вернуть последнее значение (в этом случае 3)