Diziler ve nesnelerdeki virgül belirtimin bir parçası mı?


215

Sondaki virgüller JavaScript'te standart mıdır, yoksa Chrome ve Firefox gibi tarayıcıların çoğu bunlara tolerans gösterir mi?

Standart olduklarını düşündüm, ama IE8 biriyle karşılaştıktan sonra puked - tabii ki IE bir şey desteklemiyor standart değil demektir.

İşte ne demek istediğime bir örnek (books dizisinin son öğesinden sonra):

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(); }
};

Geçen gün buldum. Bir C # programcısı olarak onlara izin verildi
alışkanlık

5
Bunu birkaç hafta önce hallettim. Bunu yeni hata ayıklama araçları olmadan IE7'de bulmaya çalıştığınızı düşünün ...
Ryan Miller

4
JS, Ruby, C # gibi dilleri keşfettiğimde beni mutlu etti - bunu kopya yapıştırma test verilerini kolaylaştırıyor ...
IE'nin

Acayip (bir tür CoffeeScript gibi) yerine önemli boşlukların sözdizimsel belirsizliğe neden olup olmayacağını merak ediyorum.
Andy

Yanıtlar:


209

Özellikler: ECMAScript 5 ve ECMAScript 3


ECMAScript 5 spesifikasyonunda Bölüm 11.1.5 :

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Yani evet, şartnamenin bir parçası.

Güncelleme: Görünüşe göre bu ES5'te yeni. ES3'te (sayfa 41), tanım sadece şuydu:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Diziler hazır değerleri için ( Bölüm 11.1.4 ) daha da ilginçtir ( Güncelleme: bu ES3'te zaten vardı):

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

( Elision_optElision opt nerede , yani Elision isteğe bağlıdır)

Elision olarak tanımlanır

Elision :
    ,
    Elision ,

Yani, bir dizi değişmez

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

tamamen yasaldır. Bu, iki öğeli bir dizi oluşturur, ancak dizi uzunluğunu olarak ayarlar 2 + 3 = 5.

IE'den çok fazla beklemeyin (IE9'dan önce) ...


1
EndoPhage'a sorduğum gibi, bunun ES3'te de standart olup olmadığını biliyor musunuz? Spesifikasyonu bulamıyorum
Adam Rackis


1
Görünüşe göre, nesne değişmezlerindeki sondaki virgül ES3 spesifikasyonunda değildi. Ancak dizilerin tanımı aynıdır.
Felix Kling

Bu ben onunla koştu dizi elemanları, bu yüzden sanırım nasıl keserseniz MS için bahane yoktur. Tekrar teşekkürler
Adam Rackis

Mikro $ oft Internet Explorer'da Utanç
pylover


52

Daha komik olan ne, IE7

[1,].length  --> 2

Firefox ve Chrome

[1,].length  --> 1

16
Ama [1,,].lengthverir 2. Sense : tarayıcılar hiçbir şey yapmaz.
David Titarenco

84
Mükemmel bir anlam ifade eder, spec bir (not: tekil) sondaki virgülün bir dizinin uzunluğuna eklenmediğini söylüyor. Chrome ve Firefox, ES5'i doğru bir şekilde uyguladı.
JaredMcAteer

7
2 (çoğul) sondaki virgül olduğunda, dizinin uzunluğuna yalnızca bir tanesi eklenir, bu nedenle son sondaki virgülün tek bir sondaki virgülün göz ardı edildiğini söylemekten daha göz ardı edildiğini söylemek daha doğru görünür.
iconoclast

4

Javascript (ECMA Script olarak da bilinir) teknik özelliklerini burada bulabilirsiniz . Diziler için ilgili tanımı sayfa 63'de bulabilirsiniz ve Felix'in belirttiği gibi, nesne tanımı birkaç sayfa sonra sayfa 65'de bulunabilir.

Bu şartname bir izlemenin iyi olduğunu söylese de, ,bunun birkaç versiyona bakarak doğru olup olmadığını bilmiyorum. Daha önce de belirttiğiniz gibi IE8-, virgül bırakırsanız ancak Chrome ve FF iyi iş görürse kendini boklar.


Başınızın üstünde, bu ES3 standardının bir parçası mıydı? ES3 teknik özelliklerini bulamıyorum
Adam Rackis

1
@Adam Onu bulmaya çalışıyorum ... Çıkış tarihleri ​​göz önüne alındığında (ES3 1999'da yayınlandı, ES4 terk edildi ve ES5 sadece 2009'da yayınlandı), ES3 standardında olması mantıklı olurdu. Ya da MS'in bir şey daha berbat etmesi olabilir.
Endophage

Görünüşe göre MS, Felix'in cevabı göz önüne alındığında bir şey daha berbattı. Senin için tekrar teşekkürler
Adam Rackis

2

Bunu parçalayalım.

Sondaki virgüller JavaScript'te standart mı?

Evet. ECMAScript 5 spesifikasyonu (Google ve Airbnb stil kılavuzunun bir parçası)

Chrome ve Firefox gibi çoğu tarayıcı bunlara tahammül ediyor mu?

Bu bir ECMAScript 5 destek sorusudur.

Babel gibi transpiller, aktarılan koddaki ek sondaki virgülleri kaldıracaktır, bu da eski tarayıcılarda sondaki virgül sorunu hakkında endişelenmenize gerek olmadığı anlamına gelir.

Yani bu şu anlama gelir:

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

Yani ES5 ve üstü bir şey kullanıyorsanız, bunun için endişelenmenize gerek yoktur.

Standart olduklarını düşündüm, ama IE8 biriyle karşılaştıktan sonra puked - tabii ki IE bir şey desteklemiyor standart değil demektir.

Yine, bu bir ECMAScript 5 destek sorusu. IE8, ECMAScript 5'i desteklemez (yalnızca IE9 ve üstü)

Airbnb'nin ES5'in kullanımdan kaldırılmış Belgelerine göz atmanızı şiddetle tavsiye ederim https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Ayrıca Mozilla'nın Dokümanlarını da öneririm:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


1

Chrome 52'de:

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

Ben sadece virgül kullanmayı sevmiyorum. İnsanlar genellikle başka bir komitenin yazdığı satırı silmek için bunları Açık Kaynak projelerinde kullanırlar. Aynı soruyu Python'da da görebilirsiniz: https://stackoverflow.com/a/11597911/968988


13
Neden 'OUHHHHH'? 1 değilse başka ne bekliyordunuz? Bu virgülden önce, tıpkı [1,] (uzunluk: 1) gibi açıkça bir öğeniz var.
Fygo

Neden 'OUHHHHH'? çünkü RFC okumadan anlamadığım bir koddan bir şey beklemiyorum. Ve evet, aynı şekilde çalışıyor [1,]: virgülden önce açıkça bir şey var. Ama [,]virgül öncesi ve sonrası kadar var. Yani [,]yalnız anlamadığım için kullanmanın [1,]iyi bir fikir olduğunu düşünmüyorum .
Nicolas Zozol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.