Чи є коси в масивах та об'єктах частиною специфікації?


215

Чи є тривалі комами стандартними в 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(); }
};

Знайшли це днями. Будучи програмістом на C #, я так звик, що їм дозволяють ...
— CaffGeek

5
Я цим займався кілька тижнів тому. Уявіть, що намагаєтеся знайти це в IE7 без жодного з нових інструментів налагодження ...
— Ryan Miller

4
Це зробило мене щасливим, коли я виявив такі мови, як JS, Ruby, C # підтримка цього - полегшує копіювання даних пробних тестів ... це розлютило мене, коли я зрозумів, що IE відсмоктує навіть це ...
— Адам Ракіс

Цікаво, чи значне пробіл замість коми (такий як CoffeeScript) спричинило б якусь синтаксичну неоднозначність?
— Енді

Відповіді:


209

Технічні характеристики: 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_optElision opt , тобто Elision необов’язковий)

Elision визначається як

Elision :
    ,
    Elision ,

Отже, масив буквальний на кшталт

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

є абсолютно законним. Це створює масив з двома елементами, але встановлює довжину масиву до2 + 3 = 5 .

Не чекайте занадто багато від IE (до IE9) ...


1
Коли я запитав EndoPhage, чи знаєте ви, чи стандарт це був і в ES3? Я не можу знайти специфікацію для цього
— Адам Ракіс


1
Мабуть, трейлінг кома в об'єктних літералах не був у специфікації ES3. Але визначення для масивів те саме.
— Фелікс Клінг

Ну, це були елементи масиву, з якими я зіткнувся з цим, тож я здогадуюся, що для MS немає виправдання, як би ви його не вирізали. Ще раз дякую
— Адам Ракіс

Ганьба на Micro $ oft Internet Explorer
— піловер

91

Просто швидке нагадування / попередження про те, що це одна з областей, в якій стандарт JavaScript / ECMAScript та JSON відрізняються; кінцеві коси дійсні в JS, але не дійсні в JSON.


1
Але знову ж таки, якщо суперсеть є для "Change Of Heart", "Чи могли б ви (все-таки) бути коханими", якщо ви лише раз налагодили?
— Лукас Бюнгер

52

Що ще смішніше, дає IE7

[1,].length  --> 2

а Firefox та Chrome

[1,].length  --> 1

16
Але [1,,].lengthдає 2. Сенс : браузери не роблять жодного.
— Девід Тітаренко

84
Має ідеальний сенс, специфікація говорить, що (зауважте: однина) кінцева кома не додає до довжини масиву. Chrome і Firefox правильно впровадили ES5.
— JaredMcAteer

7
Коли є 2 (множина) кінцевих коми, лише одна додає довжину масиву, тому здається, що точніше сказати, що остаточна кінцева кома ігнорується, ніж сказати, що одна кінцева кома ігнорується.
— іконоборство

4

Ви можете знайти специфікацію javascript (він же, сценарій ECMA) тут . Ви можете знайти відповідне визначення для масивів на сторінці 63, і як зазначав Фелікс, визначення об'єкта на пару сторінок пізніше на сторінці 65.

Хоча ця специфікація говорить, що це добре, щоб мати кейс, ,я не знаю, чи це було б правдою, оглядаючи кілька версій. Як ви вже зазначали, IE8 - буде лайно себе, якщо ви залишите коду, що перебуває в кінці, але Chrome і FF справляються з цим добре.


Чи була ця частина стандарту ES3 вгорі голови? Я не можу знайти специфікацію ES3
— Адам Ракіс

1
@Adam Я намагався його знайти ... Враховуючи дати випуску (ES3 був опублікований у 1999 році, ES4 був покинутий, а ES5 був опублікований лише у 2009 році), було б сенс, що він був у стандарті ES3. Або це може бути просто те, що МС викрутила ще одну річ.
— Ендофаг

Схоже, що М. С. викрутив ще одну річ, давши відповідь Фелікса. Ще раз дякую за ваше
— Адам Ракіс

2

Розберемо це.

Чи є кінцеві коми стандартними в 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


1

У Chrome 52:

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

Мені просто не подобаються сліди комами. Люди зазвичай використовують їх у проектах з відкритим кодом, щоб уникнути стирання рядка, написаного іншим комітетом. Дивіться те саме питання в Python: https://stackoverflow.com/a/11597911/968988


13
Чому "OUHHHHH"? Що ще ти там очікував, якщо не 1? Перед цією комою ви чітко "маєте елемент", як і [1,] (довжина: 1).
— Фіго

Чому "OUHHHHH"? тому що я не чекаю нічого від коду, який я не розумію, не читаючи RFC. І так, це працює так само [1,]: перед комою явно щось є. Але в [,]є стільки ж, як до і після коми. Тому що я не розумію [,]поодинці, я не думаю, що використовувати [1,]це гарна ідея.
— Ніколя Зозол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.