JavaScript

Array.prototype.copyWithin()メソッド

 編集:2022.08.07 by T.A.

サイズを変更せずに、配列の一部を同じ配列内の別の場所にシャロー コピーして返します。

arr.copyWithin(target[, start[, end]] )
arr Arrayオブジェクト
target シーケンスのコピー先となる、0 から始まるインデックスです。負の場合、target は最後から数えられます。

targetarr.length 以上の場合、何もコピーされません。

targetstart より後に配置されている場合、コピーされたシーケンスは arr.length に合うように切り詰められます。

start 省略可。要素のコピー元の始まりを表す、0 から始まるインデックスです。

負の場合、start は最後から数えられます。

start が省略された場合、copyWithin は最初の要素からコピーします(つまり、初期値は 0 です)。

end 省略可。要素のコピー元の末尾を表す、0 から始まるインデックスです。

copyWithin のコピーは end を含みません。

負の場合、end は最後から数えられます。

end が省略された場合、copyWithin は最後までコピーします(つまり、初期値は arr.length です)。

戻り値

変更された配列です。

解説

copyWithin メソッドは C 言語や C++ 言語の memmove のような動きをし、Array のデータをシフトさせる高いパフォーマンスのメソッドです。これは特に TypedArray の同名メソッドに当てはまります。シーケンスはコピーされ貼り付けられる処理が一命令で行われます。コピー&ペースト領域が重なっている場合でも、ペーストされたシーケンスはコピーされた値を持ちます。

copyWithin 関数は、ジェネリック関数として動作します。this 値が Array オブジェクトである必要はありません。

copyWithin は可変メソッドであり、this オブジェクト自身を変更し、コピーではなく、オブジェクト自身を返します。

¶省く

D=[1, 2, 3, 4, 5].copyWithin(2); //=[1, 2, 1, 2, 3]
D=[1, 2, 3, 4, 5].copyWithin(-2); //=[1, 2, 3, 1, 2]
D=[1, 2, 3, 4, 5].copyWithin(0, 3); //=[4, 5, 3, 4, 5]
D=[1, 2, 3, 4, 5].copyWithin(0, 3, 4); //=[4, 2, 3, 4, 5]
D=[1, 2, 3, 4, 5].copyWithin(0, -2, -1); //=[4, 2, 3, 4, 5]
D=[].copyWithin.call({length:5, 3:10}, 1, 3); //={1:10, 3:10, length:5}

// ES2015 型付き配列は Array のサブクラスです
var i32a = new Int32Array([1, 2, 3, 4, 5]);
D=i32a.copyWithin(0, 2); //=Int32Array[3, 4, 5, 4, 5]

// まだ ES2015 に準拠していないプラットフォームの場合:
D=[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4); //=Int32Array[4, 2, 3, 4, 5]

テスト