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


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.