Apakah trailing koma dalam array dan objek bagian dari spesifikasi?

215

Apakah trailing koma standar dalam JavaScript, atau apakah sebagian besar browser seperti Chrome dan Firefox hanya mentolerirnya?

Saya pikir mereka standar, tetapi IE8 muntah setelah bertemu satu — tentu saja IE tidak mendukung sesuatu yang hampir tidak berarti itu bukan standar.

Berikut ini contoh yang saya maksud (setelah elemen terakhir dari susunan buku):

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(); }
};
Adam Rackis
sumber
Menemukan ini tempo hari. Menjadi seorang programmer C # saya begitu terbiasa mereka diizinkan ...
CaffGeek
5
Saya berurusan dengan ini beberapa minggu yang lalu. Bayangkan mencoba menemukan ini di IE7 tanpa alat debugging yang lebih baru ...
Ryan Miller
4
Itu membuat saya senang ketika saya menemukan bahasa seperti JS, Ruby, C # mendukung ini — membuat copy paste data tes mudah ... itu membuat saya marah ketika saya menyadari IE menyebalkan bahkan ini ...
Adam Rackis
Saya bertanya-tanya apakah spasi yang signifikan bukan koma (seperti CoffeeScript) akan menyebabkan ambiguitas sintaksis?
Andy

Jawaban:

209

Spesifikasi: ECMAScript 5 dan ECMAScript 3


Bagian 11.1.5 dalam spesifikasi ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Jadi ya, itu adalah bagian dari spesifikasinya.

Pembaruan: Rupanya ini baru di ES5. Dalam ES3 (halaman 41), definisi itu hanya:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Untuk literal array ( Bagian 11.1.4 ) bahkan lebih menarik ( Pembaruan: ini sudah ada di ES3):

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

(Di mana Elision_optElision opt , artinya Elision adalah opsional)

Elision didefinisikan sebagai

Elision :
    ,
    Elision ,

Jadi, array literal suka

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

sangat legal. Ini menciptakan array dengan dua elemen tetapi mengatur panjang array menjadi 2 + 3 = 5.

Jangan berharap terlalu banyak dari IE (sebelum IE9) ...

Felix Kling
sumber
1
Ketika saya bertanya pada EndoPhage, apakah Anda mengetahui apakah ini juga standar dalam ES3? Saya tidak dapat menemukan spek untuk itu
Adam Rackis
1
Rupanya, tanda koma di objek literal tidak ada dalam spesifikasi ES3. Tetapi definisi untuk array adalah sama.
Felix Kling
Yah itu adalah elemen array yang saya temui, jadi saya kira tidak ada alasan untuk MS tidak peduli bagaimana Anda memotongnya. Terima kasih lagi
Adam Rackis
Malu pada Micro $ of the Internet explorer
pylover
91

Hanya pengingat / peringatan cepat bahwa ini adalah salah satu area di mana standar JavaScript / ECMAScript dan standar JSON berbeda; trailing koma valid di JS tetapi tidak valid di JSON.

Joey Sabey
sumber
1
Tapi sekali lagi, jika superset ada dalam "Change Of Heart", "Bisakah Anda (masih) dicintai" jika Anda hanya sesekali menyesuaikan?
Lukas Bünger
52

Apa yang lebih lucu, IE7 memberikan

[1,].length  --> 2

sementara Firefox dan Chrome

[1,].length  --> 1
seeg
sumber
16
Tapi [1,,].lengthmemberi 2. Sense : browser tidak menghasilkan apa-apa.
David Titarenco
84
Masuk akal, spesifikasi mengatakan bahwa koma (catatan: tunggal) trailing tidak menambah panjang array. Chrome dan Firefox telah menerapkan ES5 dengan benar.
JaredMcAteer
7
Ketika ada 2 koma trailing (jamak), hanya satu yang menambah panjang array, jadi sepertinya lebih akurat untuk mengatakan bahwa koma trailing akhir diabaikan daripada mengatakan koma trailing tunggal diabaikan.
iconoclast
4

Anda dapat menemukan spesifikasi untuk javascript (alias ECMA Script) di sini . Anda dapat menemukan definisi yang relevan untuk array di halaman 63 dan seperti yang Felix catat, definisi objek beberapa halaman kemudian di halaman 65.

Sementara spesifikasi ini mengatakan tidak apa-apa untuk mengikuti ,saya tidak tahu apakah itu akan benar melihat kembali beberapa versi. Seperti yang telah Anda catat, IE8- akan menjadi omong kosong jika Anda meninggalkan tanda koma, tetapi Chrome dan FF akan menanganinya dengan baik.

Endofag
sumber
Dari atas kepala Anda, apakah ini bagian dari standar ES3? Saya tidak dapat menemukan spec ES3
Adam Rackis
1
@ Adam Saya sudah berusaha untuk menemukannya ... Mengingat tanggal rilis (ES3 diterbitkan pada tahun 1999, ES4 ditinggalkan dan ES5 hanya diterbitkan pada tahun 2009), masuk akal bahwa itu dalam standar ES3. Atau mungkin saja MS mengacaukan satu hal lagi.
Endophage
Sepertinya MS mengacaukan satu hal lagi yang diberikan jawaban Felix. Terima kasih sekali lagi untuk Anda
Adam Rackis
2

Mari kita hancurkan ini.

Apakah trailing koma standar dalam JavaScript?

Iya. Pada spesifikasi ECMAScript 5 (juga bagian dari panduan gaya Google dan Airbnb)

Apakah sebagian besar peramban seperti Chrome dan Firefox hanya mentolerirnya?

Ini adalah pertanyaan dukungan ECMAScript 5.

Transpiler seperti Babel akan menghapus koma trailing tambahan dalam kode yang di-transkrip yang berarti Anda tidak perlu khawatir tentang masalah trailing koma di browser lawas.

Jadi itu berarti:

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

Jadi kemungkinannya adalah jika Anda menggunakan ES5 dan ke atas Anda tidak perlu khawatir tentang hal itu.

Saya pikir mereka standar, tetapi IE8 muntah setelah bertemu satu — tentu saja IE tidak mendukung sesuatu yang hampir tidak berarti itu bukan standar.

Sekali lagi, itu adalah pertanyaan dukungan ECMAScript 5. IE8 tidak mendukung ECMAScript 5 (hanya IE9 dan lebih tinggi)

Saya sangat merekomendasikan untuk melihat Dokumentasi ES5 Airbnb yang sudah usang https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Saya juga akan merekomendasikan Mozilla's Documents:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas

garrettmac
sumber
1

Di Chrome 52:

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

Saya hanya tidak suka koma tertinggal. Orang biasanya menggunakannya dalam proyek Open Source untuk menghindari menghapus baris yang ditulis oleh komiter lain. Lihat pertanyaan yang sama dengan Python: https://stackoverflow.com/a/11597911/968988

Nicolas Zozol
sumber
13
Kenapa 'OUHHHHH'? Apa lagi yang Anda harapkan di sana jika tidak 1? Anda jelas-jelas 'memiliki elemen' sebelum koma itu, seperti [1,] (yang panjangnya: 1).
Fygo
Kenapa 'OUHHHHH'? karena saya tidak mengharapkan apa pun dari kode yang tidak saya mengerti tanpa membaca RFC. Dan ya, itu berfungsi seperti [1,]: jelas ada sesuatu sebelum koma. Tetapi di [,]sana ada banyak sebelum dan sesudah koma. Jadi karena saya tidak mengerti [,]sendiri, saya tidak berpikir menggunakan [1,]ide yang bagus.
Nicolas Zozol