Internet Explorer 9 подавляется лишними запятыми в конце литералов массива и объекта?

Современные браузеры и среды, такие как Node.js, позволяют произносить {a: 1, b: 2,} или [1,2,3,]. Это исторически было проблемой для Internet Explorer. Это исправлено в Internet Explorer 9?


person user621486    schedule 18.02.2011    source источник
comment
Не уверен, но есть ли причина, по которой вы могли бы оставить конечный ,?   -  person alex    schedule 18.02.2011
comment
@alex: Случайно. Поверьте мне.   -  person SLaks    schedule 18.02.2011
comment
Я знаю, что это меня сильно укусило. Такая мелочь, чтобы увидеть ...   -  person Jared Farrish    schedule 18.02.2011
comment
При ручном редактировании кода очень удобно оставлять запятую в конце и сокращать потенциальную ошибку в будущем при добавлении или удалении строк.   -  person Bryce    schedule 18.05.2015
comment
@alex другая причина - если вы хотите создать массив JS из серверной части [ {{ for_each elem in list }} {{elem}}, {{end}}] . Синтаксис придуман.   -  person Alexander Suraphel    schedule 03.07.2017


Ответы (2)


На этот вопрос есть два разных ответа: один для висящих запятых в инициализаторах объектов и один для висящих запятых в инициализаторах массивов:

Для инициализаторов объектов, например:

var obj = {
    a: 1,
    b: 2,
    c: 3,
};

Это исправлено в IE8 и более поздних версиях. Проверьте это здесь: http://jsbin.com/UXuHopeC/1 (источник). IE7 и более ранние версии будут выдавать синтаксическую ошибку на } после запятой.

Для инициализаторов массивов, например:

var arr = [
    1,
    2,
    3,
];

Это было «исправлено» в IE9 и выше. Проверьте это здесь: http://jsbin.com/UXuHopeC/2 (источник). IE8 и более ранние версии предоставят этому массиву четыре записи, последняя из которых имеет значение undefined. IE9 и выше дают ему три записи.

Я заключил «фиксированное» в кавычки, потому что в спецификации изначально не было ясно, должен ли массив иметь последнюю undefined запись или нет, поэтому оба поведения не были неправильными. Просто IE пошли одним путем, а все остальные пошли другим. :-)

person T.J. Crowder    schedule 05.11.2013
comment
Обратите внимание, что есть некоторые версии IE, в которых это не работает ... У меня только что возникла проблема с нашим программным обеспечением в IE 9 Update 9.0.30 из-за конечной запятой в литерале объекта. Бью себя по голове за то, что решил оставить это там, поскольку мы больше не поддерживаем IE 8 и ниже. - person Juan Mendes; 06.01.2015
comment
@JuanMendes: Я не верю, что какая-либо версия IE9 имеет конечную запятую в ошибке объектного литерала, поскольку она была исправлена ​​в IE8. - person T.J. Crowder; 06.01.2015
comment
Заказчик только что отправил сообщение об ошибке, сказав, что в IE 9 Update 9.0.23 все нормально, но в IE 9 Update 9.0.30 нет ошибок, вероятно, это регресс, который был исправлен почти сразу. Я пытаюсь достать эту конкретную версию, чтобы доказать это, но отчет выглядит так, как будто заказчик действительно проявил должную осмотрительность. - person Juan Mendes; 06.01.2015
comment
@JuanMendes: Интересно. - person T.J. Crowder; 06.01.2015
comment
В чем разница между инициализатором и литералом? Если я скажу var a = [1,];, это отличается от my_func([1,]);? - person Nick T; 28.10.2015
comment
@NickT: нет, инициализатор - это просто слово, используемое для них в спецификации. Большинство людей называют их литералами массива и литералами объектов. В спецификации нет, он использует литерал только для таких вещей, как строковые литералы, числовые литералы и (что интересно) литералы регулярных выражений. Если бы мне пришлось угадывать, то различие между ними было бы в том, что литерал не содержит никаких выражений, а инициализатор может. Но я там предполагаю. - person T.J. Crowder; 28.10.2015
comment
@JuanMendes Я нашел таблицу с этими версиями 9.0.x: Internet Explorer 9 # Releasegeschiedenis (да, это на голландском) - person Gras Double; 25.06.2017

В этом документе утверждается, что он исправлен / будет исправлен: http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx

Исправленные проблемы

Завершающие запятые в литералах массива добавляются к длине массива.

Пример

var len = [1,2,3,].length;

alert(len); //should be 3, IE8 says 4

Здесь не упоминаются объекты. Просто массивы.


РЕДАКТИРОВАТЬ: дополнительная информация. Из этого PDF-документа:

http://download.microsoft.com/download/8/4/2/8427CF1B-08B3-4557-952D-102E7A8FA64C/%5BMS-ES3%5D.pdf

... скачано с этой страницы: http://msdn.microsoft.com/en-us/library/ff520996(VS.85).aspx

JScript 5.8 поддерживает использование одной конечной запятой в качестве последнего элемента в ObjectLiteral. JScript 5.7 не поддерживает это расширение.

person user113716    schedule 18.02.2011