An array initialiser is the Array literal []. It is a list of zero or more expressions. These expressions don't need to be literals. Elements may be "elided" (absent) at the start, the middle or the end of the list. Whenever a comma is not preceeded by an expression (but by another comma or the [, it simply adds one to the length of the array. The property will not actually exist. When a comma is at the end of a list, with only the ] following, it does not increase the length of the array.
[1,2,3].length; // 3
[1,,3].length; // 3
[,,2,3].length; // 4
[1,2,,].length; // 3
[,,2,,].length; // 4
[,,,].length; // 3
Syntax:
ArrayLiteral :
[ Elision(opt) ]
[ ElementList ]
[ ElementList, Elision(opt) ]
ElementList :
Elision(opt) AssignmentExpression
ElementList , Elision(opt) AssignmentExpression
Elision :
,
Elision ,
Semantics:
ArrayLiteral : [ Elision(opt) ]
function evaluate([ Elision(opt) ]) {
var array = new Array();
var pad = evaluate(Elision); // len
array.[[Put]]("length", pad, false);
return array;
}
ArrayLiteral : [ ElementList ]
function evaluate([ ElementList ]) {
return evaluate(ElementList);
}
ArrayLiteral : [ ElementList , Elision(opt) ]
function evaluate([ ElementList , Elision(opt) ]) {
var array = evaluate(ElementList);
var pad = evaluate(Elision) || 0;
var len = array.[[Get]]("length");
var array.[[Put]]("length", ToUint32(pad+len), false);
return array;
}
ElemetList : Elision(opt) AssignmentExpression
function evaluate(Elision(opt) AssignmentExpression) {
var array = new Array();
var firstIndex = evaluate(Elision) || 0;
var initResult = evaluate(AssignmentExpression);
var initValue = GetValue(initResult);
var array.[[DefineOwnProperty]](ToString(firstIndex), PD{[[Value]]:initValue, [[Writable]]:true, [[Enumerable]]:true, [[Configurable]]:true}, false);
return array;
}
ElementList : ElementList , Elision(opt) AssignmentExpression
function evaluate(ElementList , Elision(opt) AssignmentExpression) {
var array = evaluate(ElementList);
var pad = evaluate(Elision) || 0;
var initResult = evaluate(AssignmentExpression);
var initValue = GetValue(initResult);
var len = array.[[Get]]("length");
var array.[[DefineOwnProperty]](ToString(ToUint32(pad+len)), PD{[[Value]]:initValue, [[Writable]]:true, [[Enumerable]]:true, [[Configurable]]:true}, false);
return array;
}
Elision : ,
function evaluate(,) {
return 1;
}
Elision : Elision ,
function evaluate(,) {
var preceding = evaluate(Elision);
return preceding + 1;
}
Note that [[DefineOwnProperty]] is used to prevent abuse in the case where the standard Array prototype has been changed somehow.