home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

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

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

JavaScript / 配列リテラルの要素区切り","について
id: 443 所有者: msakamoto-sf    作成日: 2009-09-26 16:03:40
カテゴリ: 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で動かした時にループの最後がおかしくなる場合があるかも知れません。

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



プレーンテキスト形式でダウンロード
現在のバージョン : 2
更新者: msakamoto-sf
更新日: 2012-01-04 15:07:19
md5:4c6e0b66425ca85f58cb749dc684c79c
sha1:9ac25bd67feb15bbd70fea0de6dff47c4bc55129
コメント
コメントを投稿するにはログインして下さい。