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