home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

JavaScript/配列リテラルの要素区切り","について

作成日: 2009-09-26 16:03:40   /   last updated at: 2012-01-04 15:07:19
カテゴリ: JavaScript 

JavaScript/オブジェクトリテラルのプロパティリストの末尾要素の","についての記事を書き終わった後、ふと配列リテラルの場合が気になったので調べてみました。

ECMA262, 11.1.4 Array Initialiser より :

ArrayLiteral :
    [ Elision(opt) ]
    [ ElementList ]
    [ ElementList , Elision(opt) ]
ElementList :
    Elision(opt) AssignmentExpression
    ElementList , Elision(opt) AssignmentExpression
Elision :
    ,
    Elision ,

これを見る限りは末尾の","は許容されているようです。そこで、簡単なJavaScriptで調べてみました。

var a = [,];
for (var i = 0; i < a.length; i++) {
    alert(a[i]);
}

試してみて驚きですが・・・

Firefox/Chrome
"undefined"が 1回 表示される。
IE8
"undefined"が2回表示される。
IE9
"undefined"が 1回 表示される。(new!)

どうもIE8の場合は "," を境に二つのundefinedがあるものと解釈されているようです。

var a = [,,,];

とすると、Firefox/Chrome/IE9なら3回undefinedがalertされ、IE8だと4回alertされます。

ちなみに本当に空っぽの場合は、Firefox/Chrome/IEともに0回でした。(lengthプロパティ == 0)

var a = [];

まとめると、配列リテラルの要素区切りの","については、末尾の","は文法上は許容されています。IEでもエラーになりません。ただし、","で終わるとIE8の場合は暗黙的にundefinedを補完しているらしいことが分かりました。従って、オブジェクトリテラルのプロパティリストの時と同様、安易に最後の","を残しておくと、IE8で動かした時にループの最後がおかしくなる場合があるかも知れません。

やはり配列リテラルの場合でも、末尾の","はきちんと削っておいた方が良いようです。


original url: https://www.glamenv-septzen.net/view/443