basyura's blog

あしたになったらほんきだす。

Array.prototype.slice

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