copyWithin【内部コピー】
fill【指定値設定】
reverse【要素反転】
sort【ソート】

Array.prototype.copyWithin【内部コピー】

メモ

  • 配列内の要素をコピー(上書き)し配列を変更
    • ~Array【型指定配列ビュー (%TypedArray%)】オブジェクト の copyWithin【内部コピー】も同じアルゴリズム
    • コピーはシャローコピー (コピー元のオブジェクトは新規生成されずに同じ参照)
    • コピー元とコピー先に重なりがあっても正しくコピー (内部でコピー順を調整)
    • 配列の範囲を超えてのコピーは行わない
    • コピーの方向が逆の場合、処理なし (コピー元の終了位置 < コピー元の開始位置)
  • 外部リンク (英語)
    Array.prototype.copyWithin (target, start [ , end ] )
    ES2022 (13) ES2021 (12) ES2020 (11)

構文

array.copyWithin( target, start[, end] ) 
array.copyWithin( target[, start[, end]] ) 

 変更後の元の配列 (配列変更)
target コピー先の要素インデックス (詳細は下記参照)
start コピー元の開始要素インデックス (詳細は下記参照)
end コピー元の終了要素インデックス (この位置は含まない:詳細は下記参照)
target説明
範囲外補正
0 ≦ target先頭からの要素インデックス
target < 0
(-1:末尾)
末尾からの要素インデックス (要素数 - target)
start説明
範囲外補正
0 ≦ start先頭からの要素インデックス
start < 0
(-1:末尾)
末尾からの要素インデックス (要素数 - start)
end説明
省略要素数
範囲外補正
0 ≦ end先頭からの要素インデックス
end < 0
(-1:末尾)
末尾からの要素インデックス (要素数 - end)

var array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
var arrayNew = array.copyWithin(5, 1, 3);
console.log(arrayNew);  // 出力:[0, 1, 2, 3, 4, 1, 2, 7]
console.log(array);     // 出力:[0, 1, 2, 3, 4, 1, 2, 7] 元の配列を変更

array = [ -8, -7, -6, -5, -4, -3, -2, -1 ];
array.copyWithin(-8, -3);
console.log(array);     // 出力:[-3, -2, -1, -5, -4, -3, -2, -1]

// シャローコピー
var arrayInner = [ 10, 20 ];
array = [ 0, arrayInner, 2 ];
array.copyWithin(2, 1);
console.log(array);     // 出力:[0, Array[2], Array[2]]
console.log(array[1]);  // 出力:[10, 20]
console.log(array[2]);  // 出力:[10, 20]
array[1][0] = 100;
console.log(array[1]);  // 出力:[100, 20]
console.log(array[2]);  // 出力:[100, 20] 参照のため変更
// 【~Array【型指定配列ビュー (%TypedArray%)】オブジェクト】
var array = [ 0, 1, 2, 3, 4, 5 ];
var typedArray = new Int32Array(array);
typedArray.copyWithin(3, 1, 4);
console.log(typedArray);        // 出力:[0, 1, 2, 1, 2, 3]
// 【コピー範囲の重なり】
var array1 = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array1.copyWithin(0, 2, 6);
console.log(array1);        // 出力:[2, 3, 4, 5, 4, 5, 6, 7]
var array2 = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array2.copyWithin(4, 2, 6);
console.log(array2);        // 出力:[0, 1, 2, 3, 2, 3, 4, 5]
// 【配列の範囲を超えてのコピーなし】
var array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array.copyWithin(5, 0, 7);
console.log(array);         // 出力:[0, 1, 2, 3, 4, 0, 1, 2]
// 【逆方向】
array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array.copyWithin(5, 3, 1);  // 処理なし
console.log(array);         // 出力:[0, 1, 2, 3, 4, 5, 6, 7]

Array.prototype.fill【指定値設定】

メモ

構文

array.fill( value[, start[, end]] ) 

 設定後の元の配列 (配列変更)
value 設定値
start 設定開始要素インデックス (詳細は下記参照)
end 設定終了要素インデックス (この位置は含まない:詳細は下記参照)
start説明
範囲外補正
0 ≦ start先頭からの要素インデックス
start < 0
(-1:末尾)
末尾からの要素インデックス (要素数 - start)
end説明
省略要素数
範囲外補正
0 ≦ end先頭からの要素インデックス
end < 0
(-1:末尾)
末尾からの要素インデックス (要素数 - end)

var array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
var arrayNew = array.fill(-1, 1, 3);
console.log(arrayNew);  // 出力:[0, -1, -1, 3, 4, 5, 6, 7]
console.log(array);     // 出力:[0, -1, -1, 3, 4, 5, 6, 7] 元の配列を変更

array = [ -8, -7, -6, -5, -4, -3, -2, -1 ];
array.fill(0, -3);
console.log(array);     // 出力:[-8, -7, -6, -5, -4, 0, 0, 0]
// 【~Array【型指定配列ビュー (%TypedArray%)】オブジェクト】
var array = [ 0, 1, 2, 3, 4, 5 ];
var typedArray = new Int32Array(array);
typedArray.fill(-1, 1, 4);
console.log(typedArray);  // 出力:[0, -1, -1, -1, 4, 5]
// 【逆方向】
array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array.fill(-1, 3, 1);   // 処理なし
console.log(array);     // 出力:[0, 1, 2, 3, 4, 5, 6, 7]

Array.prototype.reverse【要素反転】

メモ

構文

array.reverse()

 要素を反転した元の配列 (配列変更)

var array = [1, 2, 3];
array.reverse();
console.log(array); // 出力:[3, 2, 1]
array = [];
array.reverse();
console.log(array); // 出力:[]

Array.prototype.sort【ソート】

メモ

  • 配列要素ソート
    • 配列自体をソート
    • 比較用コールバック関数の指定可
    • 比較で等しい要素の順序は元のまま
  • 外部リンク (英語)
    Array.prototype.sort (comparefn)
    ES2022 (13) ES2021 (12) ES2020 (11)

構文

array.sort( [comparefn] )

 要素をソートした元の配列 (配列変更)
comparefn 比較用コールバック関数 (詳細は下記参照)
省略:文字列変換して比較 (実装依存)
例外 TypeError 例外
comparefn が呼び出し可能な関数オブジェクト以外 (実装依存)
コールバック関数 引数名 (例)説明
x要素x (実装依存)
y要素y (実装依存)
戻り値 (比較結果)説明
x < y とみなす
0x = y とみなす
y < x とみなす

// 数値比較
function func(x, y) {
  const ret = x - y;
  console.log("x:" + x, "y:" + y, "戻り値:" + ret);
  return ret;
}

let array = [2, 3, 1, 2, 123];
array.sort(func);  // 実装によってはx・y逆転 (ソート結果は同じ)
// 出力:x:2 y:3 戻り値:-1
// 出力:x:3 y:1 戻り値:2
// 出力:x:2 y:1 戻り値:1
// 出力:x:3 y:2 戻り値:1
// 出力:x:2 y:2 戻り値:0
// 出力:x:3 y:123 戻り値:-120
console.log(array);
// 出力:Array(5) [1, 2, 2, 3, 123]

array = [2, 3, 1, 2, 123];
array.sort();
console.log(array);
// 出力:Array(5) [1, 123, 2, 2, 3] (実装依存)

array = [];
array.sort(func);
console.log(array);
// 出力:Array() []

array = [2, 3, 1, 2, 123];
array.sort(null);  // TypeError 例外 (実装依存)