Являются ли запятые в массивах и объектах частью спецификации?

Являетесь ли конечные запятые стандартными в JavaScript или большинство браузеров, таких как Chrome и Firefox, просто терпят их?

Я думал, что они стандартные, но IE8 погубил после того, как столкнулся с одним из IE, который не поддерживает что-то, что вряд ли означает его не стандартное.

Вот пример того, что я имею в виду (после последнего элемента массива книг):

var viewModel = {
    books: ko.observableArray([
        { title: "..", display: function() { return ".."; } },
        { title: "..", display: function() { return ".."; } },
        { title: "..", display: function() { return ".."; } }, // <--right there
    ]),
    currentTemplate: ko.observable("bookTemplate1"),
    displayTemplate: function() { return viewModel.currentTemplate(); }
};

Ответ 1

Спецификации: ECMAScript 5 и ECMAScript 3


Раздел 11.1.5 в спецификации ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Так что да, это часть спецификации.

Обновление: По-видимому, это новое в ES5. В ES3 (стр. 41) определение было просто:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Для массивов литералов (Раздел 11.1.4) это еще более интересно ( Обновление:, это уже существовало в ES3):

ArrayLiteral :
    [ Elisionopt ]
    [ ElementList ]
    [ ElementList , Elision_opt ]

(где Elision_opt - Elision opt, что означает, что Elision не является обязательным)

Elision определяется как

Elision :
    ,
    Elision ,

Итак, литерал массива вроде

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

является совершенно законным. Это создает массив с двумя элементами, но устанавливает длину массива в 2 + 3 = 5.

Не ожидайте слишком многого от IE (до IE9)...

Ответ 2

Просто быстрое напоминание/предупреждение о том, что это одна из областей, где стандарт JavaScript/ECMAScript и стандарт JSON отличаются; конечные запятые действительны в JS, но недействительны в JSON.

Ответ 3

Что еще смешнее, IE7 дает

[1,].length  --> 2

в то время как Firefox и Chrome

[1,].length  --> 1

Ответ 4

Здесь вы можете найти спецификацию для javascript (aka ECMA Script) здесь. Вы можете найти соответствующее определение для массивов на стр. 63 и, как отметил Феликс, определение объекта на нескольких страницах позже на стр. 65.

В то время как в этой спецификации написано, что отлично иметь хвостовое ,, я не знаю, было ли это правдой оглядываться назад на несколько версий. Как вы уже отмечали, IE8 - держит себя, если оставить левую запятую, но Chrome и FF справятся с этим.

Ответ 5

В Chrome 52:

[1,].length --> 1
[1,2,].length --> 2
[].length --> 0 
[,].length --> 1    <<<<=== OUHHHHH !!!!

Мне просто не нравятся запятые. Обычно люди используют их в проектах с открытым исходным кодом, чтобы избежать стирания строки, написанной другим коммитером. См. Тот же вопрос в Python: fooobar.com/questions/24625/...

Ответ 6

Пусть это сломается.

Являетесь ли конечные запятые стандартными в JavaScript?

Да. Что касается спецификации ECMAScript 5 (также являющейся частью руководства по стилю Google и Airbnb)

Большинство браузеров, таких как Chrome и Firefox, просто терпят их?

Это вопрос поддержки ECMAScript 5.

Транспилеры, такие как Babel, удаляют дополнительную конечную запятую в переданном коде, что означает, что вам не нужно беспокоиться о проблемах с конечной запятой в старых браузерах.

Таким образом, это означает:

var heroes = [
  'Batman',
  'Superman',
];
// heroes.length === 2 (not 3)

Скорее всего, если вы используете что-то ES5 и вам не нужно беспокоиться об этом.

Я думал, что они стандартны, но IE8 потупился после того, как столкнулся с тем, что IE не поддерживает что-то, что вряд ли означает его не стандартное.

Опять же, что вопрос поддержки ECMAScript 5. IE8 не поддерживает ECMAScript 5 (только IE9 и выше)

Я настоятельно рекомендую взглянуть на устаревшую документацию Airbnb ES5. Https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Я бы также рекомендовал документы Mozilla:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas