本頁の目次 目次

15.4 Array オブジェクト (Array Objects)

Array オブジェクトはプロパティ名のクラスに特別な扱いを与える。プロパティ名 P (文字列値形式) は、ToString(ToUint32(P)) と P が等しく、かつ ToUint32(P) と 232-1 が等しくない場合、配列のインデックスであり、かつこの場合に限られる。各 Array オブジェクトは length プロパティを持ち、その値は常に 232 未満の負でない整数\である。length プロパティの値は配列のインデックスである各プロパティ名よりも数値的に大きい; Array オブジェクトのプロパティが作成または変更されるときは、他のプロパティがこの不変を維持する必要からいつでも調整される。特別に、配列のインデックスのプロパティが追加されるときはいつでも、length プロパティは変更され、必要であれば、配列のインデックスの数値的な値より大きくなる; そして length プロパティが変更されるといつでも、新しい length 以上の値の配列インデックスの各プロパティは自動的に削除される。この制約は Array オブジェクト自身のプロパティにのみ適用され、length やその prototype から継承されうる配列インデックスプロパティによっては影響されない。

15.4.1 関数として呼出される Array コンストラクタ (The Array Constructor Called as a Function)

Array がコンストラクタとしてではなく関数として呼出されるならば、新規に Array オブジェクトを生成して初期化する。関数呼出し Array(...) は、同じ引数を持つオブジェクト生成式 new Array(...) と等価である。

15.4.1.1 Array ( [ item1 [ , item2 [ , ... ] ] ] )

Array 関数が呼出されると、次のステップが取られる:

  1. 同じ引数\で Array コンストラクタを呼出す (セクション 15.4.2) のと全く同様に、新規 Array オブジェクトを生成して返す。

15.4.2 Array コンストラクタ (The Array Constructor)

Array が new 式の一部として呼出されるとき、それはコンストラクタである; 新規に生成したオブジェクトを初期化する。

15.4.2.1 new Array ( [ item0 [ , item1 [ , ... ] ] ] )

この説明は、引数を与えられないか、 2 つ以上与えられる Array コンストラクタに適用する。

新規に構築されたオブジェクトの [[Prototype]] プロパティは、 Array.prototype の初期値 (せくしょん 15.4.3.1) である、オリジナルの Array プロトタイプオブジェクトに設定される。

新規に構築されたオブジェクトの [[Class]] プロパティは、 "Array" に設定される。新規に構築されたオブジェクトの length プロパティは、引数の数に設定される。

新規に構築されたオブジェクトの 0 プロパティは、 (供給された) item0 に設定される; 新規に構築されたオブジェクトの 1 プロパティは、(もし供給されれば) item1 に設定される; そして、一般に、そこにあるのと同じだけの引数に対して、新規に構築されたオブジェクトの k プロパティは、第一引数を引数番号 0 と考えて引数 k に設定される。

15.4.2.2 new Array (len)

新規に構築されるオブジェクトの [[Prototype]] プロパティは、Array.prototype (セクション 15.4.3.1) の初期値である、オリジナルの Array プロトタイプオブジェクトに設定される。新規に構築されるオブジェクトの [[Class]] プロパティは "Array" に設定される。

引数 len が Number で、かつ ToUint32(len) が len と等しければ、新規に構築されるオブジェクトの length プロパティは、 ToUint32(len) に設定される。引数 len が Number で、かつ ToUint32(len) か len と等しくなければ、例外 RangeError が投げられる。

引数 len が Number でなければ、新規に構築されるオブジェクトの length プロパティは 1 に設定され、新規に構築されるオブジェクトの 0 プロパティは、 len に設定される。

15.4.3 Array コンストラクタのプロパティ (Properties of the Array Constructor)

Array コンストラクタの内部 [[Prototype]] プロパティの値は、 Function プロトタイプオブジェクト (セクション 15.3.4) である。

内部プロパティ及び length プロパティ (値は 1 ) の他に、Array コンストラクタは次のプロパティを持つ:

15.4.3.1 Array.prototype

Array.prototype の初期値は Array プロトタイプオブジェクト (セクション 15.4.4) である。

このプロパティは、属性 { DontEnum, DontDelete, ReadOnly } である。

15.4.4 Array プロトタイプオブジェクトのプロパティ (Properties of the Array Prototype Object)

Array プロトタイプオブジェクトの内部 [[Prototype]] プロパティの値は、 Object プロトタイプオブジェクト (セクション 15.2.3.1) である。

Array プロトタイプオブジェクトはそれ自身が配列である; その [[Class]] は "Array" で、 length プロパティ (初期値は +0) とセクション 15.4.5.1 に述べる特殊な内部 [[Put]] メソッドを持つ。

プロトタイプオブジェクトのプロパティである関数の説明において、以降フレーズ "このオブジェクト" は関数実施の this 値であるオブジェクトを参照する。内部 [[Class]] プロパティの値が "Array" でないオブジェクトであることが this に許可される。

NOTE Array プロトタイプオブジェクトは独自の valueOf プロパティを持たない; だが、 valueOf プロパティを Object プロトタイプオブジェクトから継承する。

15.4.4.1 Array.prototype.constructor

Array.prototype.constructor の初期値は、組込み Array コンストラクタである。

15.4.4.2 Array.prototype.toString ( )

この関数の呼び出しの結果は、このオブジェクトに組込み join メソッドを引数無しで呼出すのと同様である。

toString 関数は汎用的ではない; this 値が Array オブジェクトでなければ、例外 TypeError を投げる。それゆえ、他の種類のオブジェクトにメソッドとして転用できない。

15.4.4.3 Array.prototype.toLocaleString ( )

配列要素は toLocaleString メソッドで文字列に変換され、それらの文字列は連結され、実装が定義するロケール特定の方法で引き出される分離子文字列で分離される。この関数の呼出しの結果は、 toString の結果に類似することが意図されるが、この関数の結果はロケール特定であることが意図される。

結果は次のように計算される:

  1. このオブジェクトの [[Get]] メソッドを引数 "length" で呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. separator をホスト環境の現在のロケールに置いて適当なリスト分離文字列 (これは実装が定義する方法で引き出される) とする。
  4. ToString(separator) を呼出す。
  5. Result(2) が 0 ならば、空文字列を返す。
  6. このオブジェクトの [[Get]] メソッドを引数 "0" で呼出す。
  7. Result(6) が undefined か null ならば、空文字列を使用する; そうでなければ、 ToObject(Result(6)).toLocaleString() を呼出す。
  8. R を Result(7) とする。
  9. k を 1 とする。
  10. k が Result(2) と等しければ、 R を返す。
  11. R と Result(4) の連結で生成される文字列値を R とする。
  12. このオブジェクトの [[Get]] メソッドを引数 ToString(k) で呼出す。
  13. Result(12) が undefined か null ならば、空文字列を使用する; そうでなければ、 ToObject(Result(12)).toLocaleString() を呼出す。
  14. S と Result(13) の連結で生成される文字列値を R とする。
  15. k を 1 増分する。
  16. ステップ 10 へ。

toLocaleString 関数は汎用的ではない; this 値が Array オブジェクトでなければ、例外 TypeError を投げる。 それゆえ、他の種類のオブジェクトにメソッドとして転用できない。

NOTE この関数の第一パラメータは、この標準の将来のバージョンで使用される可能性がある; 実装はこのパラメータを他の用途に使用しないことを推奨する。

15.4.4.4 Array.prototype.concat ( [ item1 [ , item2 [ , ... ] ] ] )

concat メソッドが 0 個以上の引数 item1, item2, etc. で呼出されると、順に各引数の配列要素が続く、オブジェクトの配列要素で構成される配列を返す。

次のステップが取られる:

  1. A を、式 new Array() と同様に生成された新規配列とする。
  2. n を 0 とする。
  3. E を このオブジェクトとする。
  4. E が Array オブジェクトでなければ、 ステップ 16 へ。
  5. k を 0 とする。
  6. E の [[Get]] メソッドを、引数 "length" で呼出す。
  7. k と Result(6) が等しければ、ステップ 19 へ。
  8. ToString(k) を呼出す。
  9. E が Result(8) という名前のプロパティを持つならば、ステップ 10 へ。 E が Result(8) という名前のプロパティを持たないならば、 ステップ 13 へ。
  10. ToString(n) を呼出す。
  11. E の [[Get]] メソッドを、引数 Result(8) で呼出す。
  12. A の [[Put]] メソッドを、引数 Result(10) と Result(11) で呼出す。
  13. n を 1 増分する。
  14. k を 1 増分する。
  15. ステップ 7 へ。
  16. ToString(n) を呼出す。
  17. A の [[Put]] メソッドを、引数 Result(16) と E で呼出す。
  18. n を 1 増分する。
  19. 引数リストから次の引数を取得する; これ以上引数がなければ、ステップ 22 へ。
  20. E を Result(19) とする。
  21. ステップ 4 へ。
  22. A の [[Put]] メソッドを、引数 "length" と n で呼出す。
  23. A を返す。

concat メソッドの length プロパティは 1 である。

NOTE concat 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 concat 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.5 Array.prototype.join (separator)

配列要素は文字列に変換され、文字列は連結され、 separator で分離される。 separator が提供されないならば、 1 つのカンマが separator に用いられる。

join メソッドは引数 separator をとり、次のステップを実行する:

  1. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. separator が undefined ならば、 separator を 1 文字の文字列 "," とする。
  4. ToString(separator) を呼出す。
  5. Result(2) が 0 ならば、空文字列を返す。
  6. このオブジェクト の [[Get]] メソッドを、引数 "0" で呼出す。
  7. Result(6) が undefined か null ならば、 空文字列を用いる; そうでなければ、 ToString(Result(6)) を呼出す。
  8. R を Result(7) とする。
  9. k を 1 とする。
  10. k が Result(2) が等しければ、 R を返す。
  11. S を、 R と Result(4) を連結して生成される文字列値とする。
  12. このオブジェクト の [[Get]] メソッドを、引数 ToString(k) で呼出す。
  13. Result(12) が undefined か null ならば、空文字列を用いる; そうでなければ、 ToString(Result(12)) を呼出す。
  14. R を、 S と Result(13) を連結して生成される文字列値とする。
  15. k を 1 増分する。
  16. ステップ 10 へ。

join メソッドの length プロパティは 1 である。

NOTE join 関数は故意に汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 join 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.6 Array.prototype.pop ( )

配列の最後の要素が配列から取り除かれ、返される。

  1. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. Result(2) が 0 以外ならば、 ステップ 6 へ。
  4. このオブジェクト の [[Put]] メソッドを、引数 "length" と Result(2) で呼出す。
  5. undefined を返す。
  6. ToString(Result(2)-1) を呼出す。
  7. このオブジェクト の [[Get]] メソッドを、引数 Result(6) で呼出す。
  8. このオブジェクト の [[Delete]] メソッドを、引数 Result(6) で呼出す。
  9. このオブジェクト の [[Put]] メソッドを、引数 "length" と (Result(2)-1) で呼出す。
  10. Result(7) を返す。

NOTE pop 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 pop 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.7 Array.prototype.push ( [ item1 [ , item2 [ , ... ] ] ] )

引数が出現した順に配列の末尾に追加される。呼出しの結果として、新しい配列の長さが返される。

push メソッドが 0 個以上の引数 item1, item2, etc. で呼出されると、次のステップが取られる:

  1. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
  2. n を ToUint32(Result(1)) 呼出しの結果とする。
  3. 引数リストから次の引数を取得する; これ以上引数がなければ、 ステップ 7 へ。
  4. このオブジェクト の [[Put]] メソッドを、引数 ToString(n) と Result(3) で呼出す。
  5. n を 1 増分する。
  6. ステップ 3 へ。
  7. このオブジェクト の [[Put]] メソッドを、引数 "length" と n で呼出す。
  8. n を返す。

push メソッドの length プロパティは 1 である。

NOTE push 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 pust 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.8 Array.prototype.reverse ( )

配列要素は順序を逆に再編される。呼出しの結果としてオブジェクトが返される。

  1. 引数 "length" で、このオブジェクトの [[Get]] メソッドを呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. floor(Result(2)/2) を算出する。
  4. k を 0 とする。
  5. k が Result(3) と等しければ、このオブジェクトを返す。
  6. Result(2)-k-1 を算出する。
  7. ToString(k) を呼出す。
  8. ToString(Result(6)) を呼出す。
  9. 引数 Result(7) で、このオブジェクトの [[Get]] メソッドを呼出す。
  10. 引数 Result(8) で、このオブジェクトの [[Get]] メソッドを呼出す。
  11. このオブジェクトが Result(8) という名前のプロパティを持たなければ、ステップ 19 へ。
  12. このオブジェクトが Result(7) という名前のプロパティを持たなければ、ステップ 16 へ。
  13. 引数 Result(7) と Result(10) で、このオブジェクトの [[Put]] メソッドを呼出す。
  14. 引数 Result(8) と Result(9) で、このオブジェクトの [[Put]] メソッドを呼出す。
  15. ステップ 25 へ。
  16. 引数 Result(7) と Result(10) で、このオブジェクトの [[Put]] メソッドを呼出す。
  17. 削除するプロパティ名として Result(8) を提供して、このオブジェクトの [[Delete]] メソッドを呼出す。
  18. ステップ 25 へ。
  19. このオブジェクトが Result(7) という名前のプロパティを持たなければ、ステップ 23 へ。
  20. 削除するプロパティ名として Result(7) を提供して、このオブジェクトの [[Delete]] メソッドを呼出す。
  21. 引数 Result(8) と Result(9) で、このオブジェクトの [[Put]] メソッドを呼出す。
  22. ステップ 25 へ。
  23. 削除するプロパティ名として Result(7) を提供して、このオブジェクトの [[Delete]] メソッドを呼出す。
  24. 削除するプロパティ名として Result(8) を提供して、このオブジェクトの [[Delete]] メソッドを呼出す。
  25. k を 1 増加させる。
  26. ステップ 5 へ。

NOTE reverse 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 reverse 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.9 Array.prototype.shift ( )

配列の最初の要素が配列から取り除かれ、返される。

  1. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. Result(2) が 0 以外ならば、 ステップ 6 へ。
  4. このオブジェクト の [[Put]] メソッドを、引数 "length" と Result(2) で呼出す。
  5. undefined を返す。
  6. このオブジェクト の [[Get]] メソッドを、引数 0 で呼出す。
  7. k を 1 とする。
  8. k が Result(2) と等しければ、 ステップ 18 へ。
  9. ToString(k) を呼出す。
  10. ToString(k-1) を呼出す。
  11. このオブジェクトが Result(9) という名前のプロパティを持つならば、 ステップ 12 へ; このオブジェクトが Result(9) という名前のプロパティを持たないならば、 ステップ 15 へ。
  12. このオブジェクト の [[Get]] メソッドを、引数 Result(9) で呼出す。
  13. このオブジェクト の [[Put]] メソッドを、引数 Result(10) と Result(12) で呼出す。
  14. ステップ 16 へ。
  15. このオブジェクト の [[Delete]] メソッドを、引数 Result(10) で呼出す。
  16. k を 1 増分する。
  17. ステップ 8 へ。
  18. このオブジェクト の [[Delete]] メソッドを、引数 ToString(Result(2)-1) で呼出す。
  19. このオブジェクト の [[Put]] メソッドを、引数 "length" と (Result(2)-1) で呼出す。
  20. Result(6) を返す。

NOTE shift 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 shift 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.10 Array.prototype.slice (start, end)

slice メソッドは 2 つの引数、 startend をとり、要素 start から要素 end の前まで (または、 end が undefined ならば配列の末尾まで) の配列要素で構成される配列を返す。 start が負ならば、 length を配列の長さとして、(length+start) として扱われる。 end が負ならば、length を配列の長さとして (length+end) として扱われる。 次のステップが取られる:

  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 を返す。

slice メソッドの length プロパティは 2 である。

NOTE slice 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 slice 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.11 Array.prototype.sort (comparefn)

配列要素はソート (並べ替え) される。ソートは必ずしも安定的ではない(つまり、等価と比較された要素が元の順で残るとは限らない). comparefn が undefined でないならば、それは 2 個の引数 xy を受け付け、 x < y ならば負の値、 x = y ならば 0、 x > y ならば正の値を返す関数であるべきである。

comparefn が undefined でなく、かつ この配列の要素について首尾一貫した比較関数 (下記参照) でない場合、 ソートの振る舞いは実装依存である。 len を ToUint32(this.length) とする。下記の全条件を満たす整数 i 及び j と オブジェクト P が存在する場合、ソートの振る舞いは実装依存である:

  • 0 ≦ i ≦ len
  • 0 ≦ j ≦ len
  • this は ToString(i) という名前のプロパティを持たない。
  • P は、 this で始まる 1 個以上の [[Prototype]] プロパティを辿ることによって取得される。
  • P は ToString(j) という名前のプロパティを持つ。

そうでなければ次のステップが取られる.

  1. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. このオブジェクトの [[Get]], [[Put]], [[Delete]] メソッドと SortCompare (後述) の呼出しを実装依存の順序で実行する。 [[Get]], [[Put]], [[Delete]] の各呼出しの第1引数は 0 以上 Result(2) 未満の整数とし、 SortCompare 呼出しの引数は先行する [[Get]] メソッド呼出しの結果とする。
  4. このオブジェクト を返す。

返されるオブジェクトは、次の 2 個のプロパティを持たなければならない。

  • 0 以上 Result(2) 未満の整数 j それぞれにとってプロパティ old[j] が存在するならば、 new[π(j)] は old[j], と全く同じ値であり、プロパティ old[j] が存在しないならば、 new[π(j)] は存在しないような、0 以上 Result(2) 未満の整数の数学的順列 π が存在しなければならない。
  • 0 以上 Result(2) 未満の全ての整数 jk それぞれについて、 SortCompare(j, k) < 0 (下記 SortCompare 参照) ならば、 π(j) < π(k) である。

ここでは、表記 old[j] でこの関数の実行前のこのオブジェクトの [[Get]] メソッドの引数 j での呼出しの仮の結果を参照し、 表記 new[j] でこの関数の実行後のこのオブジェクトの [[Get]] メソッドの引数 j での呼出しの仮の結果を参照する。

下記の必要条件の全てが集合 S 内の値 a, b, c (または同じ値) 全てについて満たされる場合、値の集合 S について関数 comparefn は首尾一貫した比較関数である: 記法 <CF bcomparefn(a,b) < 0 を意味する; a =CF bcomparefn(a,b) = 0 (of either sign) を意味する; a >CF bcomparefn(a,b) > 0 を意味する。

  • comparefn(a,b) 呼出しは、 2 個の引数として a と b の値のペアを与えられるとき常に同じ値 v を返す。 さらに、 v は Number 型であり、 v は NaN ではない。 与えられる a と b のペアにとって、厳密には a <CF b, a =CF b, a >CF b のうち一つは true になるということに注意。
  • a =CF a (再帰)
  • a =CF b ならば、 b =CF a (対称)
  • a =CF b かつ b =CF c ならば、 a =CF c (=CF の他動)
  • a <CF b かつ b <CF c ならば、 a <CF c (<CF の他動)
  • a >CF b かつ b >CF c ならば、 a >CF c (>CF の他動)

NOTE 上の条件は、 comparefn が集合 S を等価な種別に分割し、その等価な種別が全く整然としているのを保証にするのに、必要かつ十分である。

SortCompare 演算子が 2 個の引数 jk で呼出されると、次のステップが取られる:

  1. ToString(j) を呼出す。
  2. ToString(k) を呼出す。
  3. このオブジェクトが Result(1) という名前のプロパティを持たず、かつ このオブジェクトが Result(2) という名前のプロパティを持たないならば、 +0 を返す。
  4. このオブジェクトが Result(1) という名前のプロパティを持たないならば、 1 を返す。
  5. このオブジェクトが Result(2) という名前のプロパティを持たないならば、 -1 を返す。
  6. このオブジェクト の [[Get]] メソッドを、引数 Result(1) で呼出す。
  7. このオブジェクト の [[Get]] メソッドを、引数 Result(2) で呼出す。
  8. x を Result(6) とする。
  9. y を Result(7) とする。
  10. xy が両方 undefined ならば、 +0 を返す。
  11. x が undefined ならば、 1 を返す。
  12. y が undefined ならば、 -1 を返す。
  13. 引数 comparefn が undefined ならば、 ステップ 16 へ。
  14. comparefn を、引数 xy で呼出す。
  15. Result(14) を返す。
  16. ToString(x) を呼出す。
  17. ToString(y) を呼出す。
  18. Result(16) < Result(17) ならば、 -1 を返す。
  19. Result(16) > Result(17) ならば、 1 を返す。
  20. +0 を返す。

NOTE 存在しないプロパティの値は、常に undefined プロパティ値より大きく比較し、 undefined は他の値よりも大きいと比較するため、 undefined プロパティ値は常に結果の末尾にソートし、存在しないプロパティの値が続く。

NOTE sort 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 sort 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.12 Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , ... ] ] ] )

splice メソッドが 2 個以上の引数 start, deleteCount, そして(選択的に) item1, item2, etc. で呼出されると、配列の添え字 start から始まる deleteCount 個の配列要素が、引数 item1, item2, etc で置換される。次のステップが取られる:

  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. min(max(ToInteger(deleteCount),0),Result(3)-Result(5)) を算出する。
  7. k を 0 とする。
  8. k が Result(6) と等価ならば、 ステップ 16 へ。
  9. ToString(Result(5)+k) を呼出す。
  10. このオブジェクトが Result(9) という名前のプロパティを持つならば、 ステップ 11 へ; このオブジェクトが Result(9) という名前のプロパティを持たないならば、 ステップ 14 へ。
  11. ToString(k) を呼出す。
  12. このオブジェクト の [[Get]] メソッドを、引数 Result(9) で呼出す。
  13. A の [[Put]] メソッドを、引数 Result(11) と Result(12) で呼出す。
  14. k を 1 増分させる。
  15. ステップ 8 へ。
  16. A の [[Put]] メソッドを、引数 "length" と Result(6) で呼出す。
  17. 追加引数 item1, item2, etc の数を算出する。
  18. Result(17) が Result(6) と等しければ、 ステップ 48 へ。
  19. Result(17) が Result(6) より大きいならば、 ステップ 37 へ。
  20. k を Result(5) とする。
  21. k が (Result(3)-Result(6)) と等しければ、 ステップ 31 へ。
  22. ToString(k+Result(6)) を呼出す。
  23. ToString(k+Result(17)) を呼出す。
  24. このオブジェクトが Result(22) という名前のプロパティを持つならば、 ステップ 25 へ; このオブジェクトが Result(22) という名前のプロパティを持たないならば、 ステップ 28 へ。
  25. このオブジェクト の [[Get]] メソッドを、引数 Result(22) で呼出す。
  26. このオブジェクト の [[Put]] メソッドを、引数 Result(23) と Result(25) で呼出す。
  27. ステップ 29 へ。
  28. このオブジェクト の [[Delete]] メソッドを、引数 Result(23) で呼出す。
  29. k を 1 増分する。
  30. ステップ 21 へ。
  31. k を Result(3) とする。
  32. k が (Result(3)-Result(6)+Result(17)) と等しければ、 ステップ 48 へ。
  33. ToString(k-1) を呼出す。
  34. このオブジェクト の [[Delete]] メソッドを、引数 Result(33) で呼出す。
  35. k を 1 減分する。
  36. ステップ 32 へ。
  37. k を (Result(3)-Result(6)) とする。
  38. k が Result(5) と等しければ、 ステップ 48 へ。
  39. ToString(k+Result(6)-1) を呼出す。
  40. ToString(k+Result(17)-1) を呼出す。
  41. このオブジェクトが Result(39) という名前のプロパティを持つならば、 ステップ 42 へ; このオブジェクトが Result(39) という名前のプロパティを持たないならば、 ステップ 45 へ。
  42. このオブジェクト の [[Get]] メソッドを、引数 Result(39) で呼出す。
  43. このオブジェクト の [[Put]] メソッドを、引数 Result(40) と Result(42) で呼出す。
  44. ステップ 46 へ。
  45. このオブジェクト の [[Delete]] メソッドを、引数 Result(40) で呼出す。
  46. k を 1 減分する。
  47. ステップ 38 へ。
  48. k を Result(5) とする。
  49. item1 から始まる引数リストの一部から、次の引数を取得する; これ以上引数がないならば、 ステップ 53 へ。
  50. このオブジェクト の [[Put]] メソッドを、引数 ToString(k) と Result(49) で呼出す。
  51. k を 1 増分する。
  52. ステップ 49 へ。
  53. このオブジェクト の [[Put]] メソッドを、引数 "length" と (Result(3)-Result(6)+Result(17)) で呼出す。
  54. A を返す。

splice メソッドの length プロパティは 2 である。

NOTE splice 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 splice 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.4.13 Array.prototype.unshift ( [ item1 [ , item2 [ , ... ] ] ] )

配列内の順所が引数リスト内に出現順と同じになるように、引数が配列の先頭に prepend される。

unshift メソッドが 0 個以上の引数 item1, item2, etc. で呼出されると、次のステップが取られる:

  1. このオブジェクト の [[Get]] メソッドを、引数 "length" で呼出す。
  2. ToUint32(Result(1)) を呼出す。
  3. 引数の数を算出する。
  4. k を Result(2) とする。
  5. k が 0 ならば、 ステップ 15 へ。
  6. ToString(k-1) を呼出す。
  7. ToString(k+Result(3)-1) を呼出す。
  8. このオブジェクトが Result(6) という名前のプロパティを持つならば、 ステップ 9 へ; このオブジェクトが Result(6) という名前のプロパティを持たないならば、 ステップ 12 へ。
  9. このオブジェクト の [[Get]] メソッドを、引数 Result(6) で呼出す。
  10. このオブジェクト の [[Put]] メソッドを、引数 Result(7) と Result(9) で呼出す。
  11. ステップ 13 へ。
  12. このオブジェクト の [[Delete]] メソッドを、引数 Result(7) で呼出す。
  13. k を 1 減分する。
  14. ステップ 5 へ。
  15. k を 0 とする。
  16. item1 で始まる引数リストの一部から、次の引数を取得する; これ以上引数がないならば、 ステップ 21 へ。
  17. ToString(k) を呼出す。
  18. このオブジェクト の [[Put]] メソッドを、引数 Result(17) と Result(16) で呼出す。
  19. k を 1 増分する。
  20. ステップ 16 へ。
  21. このオブジェクト の [[Put]] メソッドを、引数 "length" と (Result(2)+Result(3)) で呼出す。
  22. (Result(2)+Result(3)) を返す。

unshift メソッドの length プロパティは 1 である。

NOTE unshift 関数は故意にに汎用的である; this 値が Array オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。 unshift 関数が host オブジェクトにうまく適用できるかどうかは、実装依存である。

15.4.5 Array インスタンスのプロパティ (Properties of Array Instances)

Array インスタンスは、 Array プロトタイプオブジェクトからプロパティを継承し、そして次のプロパティも持つ。

15.4.5.1 [[Put]] (P, V)

Array オブジェクトは変化した [[Put]] メソッドを用いて他の Native ECMAScript オブジェクトのために使用される。

A を Array オブジェクト、 P を文字列と想定する。

A の [[Put]] メソッドが、プロパティ P と値 V で呼出されるとき、次のステップが取られる:

  1. A の [[CanPut]] method を名前 P で呼出す。
  2. Result(1) が false ならば、戻る。
  3. A 名前 P のプロパティを持たないならば、ステップ 7 へ。
  4. P が "length" ならば、ステップ 12 へ。
  5. A のプロパティ PV に設定する。
  6. ステップ 8 ヘ。
  7. 名前 P のプロパティを生成し、値を V に設定し空の属性を与える。
  8. P が配列の添え字でなければ、戻る。
  9. ToUint32(P) が A の length プロパティ未満ならば、戻る。
  10. A の length プロパティを ToUint32(P)+1 に変更 (または設定) する。
  11. 戻る。
  12. ToUint32(V) を算出する。
  13. Result(12) が ToNumber(V) と等しくなければ、例外 RangeError を投げる。
  14. A の length プロパティ の値未満であり Result(12) 未満でない各整数 k について、 A 自身が ToString(k) という名前の (継承したプロパティではない) プロパティを持つならば、そのプロパティを削除する。
  15. A のプロパティ P の値を Result(12) に設定する。
  16. 戻る。

15.4.5.2 length

Array オブジェクトの length プロパティは、配列の添え字を名前とする各プロパティの名前より、常に数値的に大きい。

length プロパティは属性 { DontEnum, DontDelete } を持つ。

Page Contents

Issued: / Revised: / All rights reserved. © 2002-2016 TAKI