1. A を、式 new Array() と同様に生成した配列とする。
2. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
3. ToUint32(Result(2)) を呼出す。
4. ToInteger(start) を呼出す。
5. Result(4) が負ならば、 max((Result(3)+Result(4)),0) を用いる;
そうでなければ min(Result(4),Result(3)) を用いる。
6. k を Result(5) とする。
7. end が undefined ならば、 Result(3) を用いる; そうでなければ ToInteger(end) を用いる。
8. Result(7) が負ならば、 max((Result(3)+Result(7)),0) を用いる;
そうでなければ min(Result(7),Result(3)) を用いる。
9. n を 0 とする。
10. k が Result(8) 以上ならば、 ステップ 19 へ。
11. ToString(k) を呼出す。
12. このオブジェクトが Result(11) という名前のプロパティを持つならば、 ステップ 13 へ;
このオブジェクトが Result(11) という名前のプロパティを持たないならば、 ステップ 16 へ。
13. ToString(n) を呼出す。
14. このオブジェクト の [[Get]] メソッドを、引数 Result(11) で呼出す。
15. A の [[Put]] メソッドを、引数 Result(13) と Result(14) で呼出す。
16. k を 1 増分する。
17. n を 1 増分する。
18. ステップ 10 へ。
19. A の [[Put]] メソッドを、引数 "length" と n で呼出す。
20. A を返す。
Array.prototype.slice
ざっくり
var array = new Object(); array[0] = 'A'; array['a'] = 'AAA'; array[1] = 'B'; array[2] = 'C'; array.length = 4; function slice(array , start , end) { function max(a , b) { return a > b ? a : b; } function min(a , b) { return a < b ? a : b; } var length = parseInt(array.length); start = isNaN(start) ? 0 : parseInt(start); start = start < 0 ? max(start + length , 0) : min(start , length); end = end == undefined ? length : parseInt(length); end = end < 0 ? max(end + length , 0) : min(end , length); var A = new Array(); var n = 0; while (start < end) { if (start.toString() in array) { var v = array[start.toString()]; A[n.toString()] = v; } n ++; start ++; } A.length = n; return A; } print(slice(array)); //=> A,B,C
数値(文字可)プロパティと length プロパティを持っていたら、数値(文字可)じゃない属性を除いて配列に変換してくれると理解。