Подтвердить что ты не робот

Почему "3 [1, 2]"; return undefined в JavaScript?

Я смотрел на некоторые вызовы AJAX, которые GMail делает, и я заметил, что иногда возвращаемое значение вызовов начиналось с числа. Пример: (обратите внимание, что после первой строки нет точки с запятой)

3 
[1, 2];

Если бы я ввел это в консоль JavaScript, я бы вернул обратно undefined. Однако, если вторым параметром является число или строка, я бы получил второй возвращаемый параметр. Пример:

3
4

Возвращает 4.

Мое предположение заключается в том, что они делают это, чтобы остановить атаки типа jsonp, однако кто-нибудь знает, что делает базовая оценка? Во втором случае я считаю, что после первой строки "вставлена" точка с запятой, что сделает возвращение 4 понятным. Однако я не могу придумать, почему первое выражение вернет undefined.

4b9b3361

Ответ 1

Это связано с тем, как работает ASI (Automatic Semicolon Insertion). Первое утверждение интерпретируется как

3[1,2];

так что это undefined. Второй интерпретируется ASI как 3;4;, который равен 4.

В некоторых случаях правила ASI несовместимы, например, вы можете задаться вопросом, почему нет точки с запятой между числом и скобкой? Ну, есть причина для этого. Прочтите эти ресурсы для более подробной информации:

Каковы правила автоматической вставки точки с запятой (ASI) для JavaScript?

http://bclary.com/2004/11/07/#a-7.9.1

Google, вероятно, даст вам больше результатов.:) Вот почему у нас есть бесконечная война без конусов JavaScript.

Ответ 2

Это необходимо для того, чтобы хакеры Ajax JSON меняли конструктор Array. Это старая ошибка, не актуальная в современных браузерах, но которая должна быть обработана.

Hack переопределяет конструктор Array, поэтому, когда JSON считывается, код выполняет то, что делает конструктор. Больше объяснений здесь: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

Кстати, именно поэтому ASP.NET всегда отправляет обратно такие объекты: {d: []}.