JavaScript

Array.prototype.copyWithin()メソッド

 編集:2022.08.02 by T.A.

その Array 内で、指定の開始位置から終了位置までを指定位置からコピー変更し、Array 自身を返します。

元の Array は更新されます。

配列の長さは変わりません。

コピーは、シャロー コピー(浅いコピー)です。

arr.copyWithin(target[, start[, end]] )
arr Arrayオブジェクト
target コピー先の位置。0~。負の場合、target は最後から数えられます。

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

start 省略可。要素のコピー元の開始位置。0~。

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

start が省略された場合、初期値は 0(arr の先頭から)です。

end 省略可。要素のコピー元の終了位置で、コピーは end を含みません。0~。

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

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

戻り値

¶Array。

解説

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]

テスト