15.4.4.10 Array.prototype.slice(start, end)

2010-07-05

array Array.prototype.slice(start:int|mixed, end:int|mixed)

Return a new array which is a subarray of this array starting at start up to, but not including, end.

If end is undefined, it becomes this.length. The start and end parameters are coerced to integers. If start is negative, start will be this.length+start. If end is negative, end will be this.length+end.

The this value is coerced into an object.

Array.prototype.slice.length = 2;

Code: (Meta Ecma)
Array.prototype.slice = function(start,end){
var O = ToObject(this);
var A = new Array;
var lenVal = O.[[Get]]("length");
var len = ToUint32(lenVal);
var relativeStart = ToInteger(start);
if (relativeStart < 0) var k = Math.max((len+relativeStart),0);
else var k = Math.min(relativeStart, len);
if (end === undefined) var relativeEnd = len;
else var relativeEnd = ToInteger(end);
if (relativeEnd < 0) var final = Math.max((len+relativeEnd), 0);
else var final = Math.min(relativeEnd, len);
var n = 0;
while (k < final) {
var Pk = ToString(k);
var kPresent = O.[[HasProperty]](Pk);
if (kPresent) {
var kValue = O.[[Get]](Pk);
A.[[DefineOwnProperty]](ToString(n), PD{[[Value]]:kValue, [[Writable]]:true, [[Enumerable]]:true, [[Configurable]]:true}, false);
}
++k;
++n;
}
return A;
}