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]); }
試してみて驚きですが・・・
どうも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で動かした時にループの最後がおかしくなる場合があるかも知れません。
やはり配列リテラルの場合でも、末尾の","はきちんと削っておいた方が良いようです。
コメント