11.1.4 Array Initialiser

2010-05-15

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.

Code: (Ecma)

[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) ]

Code: (Meta Ecma)
function evaluate([ Elision(opt) ]) {
var array = new Array();
var pad = evaluate(Elision); // len
array.[[Put]]("length", pad, false);
return array;
}


ArrayLiteral : [ ElementList ]

Code: (Meta Ecma)
function evaluate([ ElementList ]) {
return evaluate(ElementList);
}


ArrayLiteral : [ ElementList , Elision(opt) ]

Code: (Meta Ecma)
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

Code: (Meta Ecma)
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

Code: (Meta Ecma)
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 : ,

Code: (Meta Ecma)
function evaluate(,) {
return 1;
}


Elision : Elision ,

Code: (Meta Ecma)
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.