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 プロパティを持っていたら、数値(文字可)じゃない属性を除いて配列に変換してくれると理解。