配列およびオブジェクトの末尾のコンマは仕様の一部ですか?


215

末尾のコンマはJavaScriptの標準的なものですか、それともChromeやFirefoxなどのほとんどのブラウザがそれらを許容するだけですか?

IE8は標準だと思っていましたが、IE8に遭遇した後は不評でした。もちろん、IEが何かをサポートしていないということは、標準ではないという意味ではありません。

これが私の意味の例です(books配列の最後の要素の後)。

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でも、この中に吸い気づいたとき...それは私が怒らせ、私を幸せに作られた
アダムRackis

コンマではなく有意な空白(CoffeeScriptのようなもの)が構文の曖昧さを引き起こすのではないでしょうか。
Andy

回答:


209

仕様:ECMAScript 5およびECMAScript 3


ECMAScript 5仕様のセクション11.1.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つの要素を持つ配列が作成されますが、配列の長さがに設定され2 + 3 = 5ます。

IEにあまり期待しないでください(IE9より前)...


1
EndoPhageに尋ねたように、これがES3の標準であるかどうかも知っていますか?私はそれのための仕様を見つけることができないようです
アダム・ラキス'30


1
どうやら、オブジェクトリテラルの末尾のコンマはES3仕様には含まれていませんでした。しかし、配列の定義は同じです。
Felix Kling、2011

私がこれに遭遇したのは配列要素だったので、MSをどのようにカットしても弁解の余地はないと思います。おかげで再び
アダムRackis

Micro $ oft Internet explorerの恥
pylover 2014


52

さらにおもしろいのは、IE7

[1,].length  --> 2

FirefoxとChrome

[1,].length  --> 1

16
しかし[1,,].length与える2センス:ブラウザは何もしません。
David Titarenco

84
完全に理にかなっている、仕様では、(注:単数形の)末尾のコンマは配列の長さに追加されないことを示しています。ChromeとFirefoxはES5を正しく実装しています。
JaredMcAteer 2012年

7
末尾のコンマが2つ(複数)ある場合、1つだけが配列の長さに追加されるため、単一の末尾のコンマが無視されるよりも、最後の末尾のコンマが無視されると言う方がより正確に思われます。
iconoclast 14

4

JavaScript(別名ECMAスクリプト)の仕様については、こちらをご覧ください。配列に関連する定義は63ページにあり、Felixが述べたように、オブジェクト定義は数ページ後で65ページにあります。

この仕様では、末尾,を付けても問題ないが、いくつかのバージョンを振り返ってそれが本当かどうかはわかりません。お気づきのように、末尾のコンマを残すとIE8-はそれ自体が失敗しますが、ChromeとFFは問題なく処理します。


頭の上の、これはES3標準の一部でしたか?ES3の仕様が見つからないようです
Adam Rackis、2011

1
@アダム私はそれを見つけようとしてきました...リリース日(ES3は1999年に公開され、ES4は放棄され、ES5は2009年にのみ公開された)を考えると、それがES3標準にあったことは理にかなっています。または、MSがもう1つのことを台無しにした可能性もあります。
エンドファージ2011

MSがFelixの答えを与えられてもう1つ失敗したようです。ありがとうございました
Adam Rackis 2011

2

これを分解してみましょう。

末尾のカンマはJavaScriptの標準ですか?

はい。ECMAScript 5仕様(これもGoogleおよびAirbnbスタイルガイドの一部)

ChromeやFirefoxなどのほとんどのブラウザーは、それらを許容するだけですか?

これはECMAScript 5サポートの質問です。

Babelのようなトランスパイラーは、トランスパイルされたコードの追加の末尾のコンマを削除します。つまり、レガシーブラウザーの末尾のコンマの問題を心配する必要はありません。

つまり:

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

したがって、ES5以降を使用している場合は、心配する必要はありません。

IE8は標準だと思っていましたが、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
なぜ「うふふふ」?1でないとしたら、他に何を期待しましたか?[1、](長さ:1)と同じように、コンマの前に明らかに「要素がある」とします。
Fygo

なぜ「うふふふ」?RFCを読まないと理解できないコードには何も期待しないからです。そして、はい、それは同じように機能し[1,]ます:カンマの前に明らかに何かがあります。しかし[,]、コンマの前後には同じくらい多くあります。[,]一人では分からないので使うの[1,]はいいとは思いません。
Nicolas Zozol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.