copyWithin【内部コピー】
with【コピー&要素変更 (配列変更なし)】
set【要素設定】
fill【指定値設定】
reverse【要素反転 (配列変更あり)】
toReversed【要素反転 (配列変更なし)】
sort【ソート (配列変更あり)】
toSorted【ソート (配列変更なし)】

%TypedArray%.prototype.copyWithin【内部コピー】

メモ

概要

  • 配列内の要素をコピー(上書き)し配列を変更
    • コピー元とコピー先に重なりがあっても正しくコピー (内部でコピー順を調整)
    • 配列の範囲を超えてのコピーは行わない
    • コピーの方向が逆の場合、処理なし (コピー元の終了位置 < コピー元の開始位置)

関連

外部リンク

構文

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

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

let num_A = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
let num_A_copyWithin = num_A.copyWithin(5, 1, 3);
console.log(num_A);
// 出力:[0, 1, 2, 3, 4, 1, 2, 7]
console.log(num_A_copyWithin);
// 出力:[0, 1, 2, 3, 4, 1, 2, 7]

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

// シャローコピー
let num_C_Inner = [ 10, 20 ];
let num_C = [ 0, 1, num_C_Inner, 3, 4 ];
console.log(num_C);
// 出力:(5) [0, 1, Array(2), 3, 4]
console.log(num_C[2]);
// 出力:(2) [10, 20]
num_C.copyWithin(3, 2);
console.log(num_C);
// 出力:(5) [0, 1, Array(2), Array(2), 3]
console.log(num_C[2]);
// 出力:[10, 20]
console.log(num_C[3]);
// 出力:[10, 20]
num_C[2][0] = 100;
console.log(num_C);
// 出力:
// (5) [0, 1, Array(2), Array(2), 3]
// 0: 0
// 1: 1
// 2: (2) [100, 20]
// 3: (2) [100, 20]
// 4: 3
// length: 5
// 【~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]

%TypedArray%.prototype.with【コピー&要素変更 (配列変更なし)】

メモ

概要

  • 配列の1要素を変更しコピー
    • 元の配列は変更なし

関連

外部リンク

  • ECMA-262 (英語)
    %TypedArray%.prototype.with ( index, value )
    ES2023 (14) ES2022 (13) ES2021 (12)

構文

typedArray.with( index, value ) 

 (%TypedArray%)コピーされた型指定配列ビュー
index設定位置インデックス (詳細は下記参照)
value設定値

RangeError 
index (設定インデックス)が範囲外
index備考
0 ≦index先頭からの要素位置
index< 0 末尾からの要素位置 (要素数index)
(-1:末尾)

const array_A = [0, 1, 2, 3, 4];
const num_A = new Int32Array(array_A);
const with_A = num_A.with(2, 99);
console.log( with_A );  // 出力:Int32Array(5) [0, 1, 99, 3, 4, (省略)]
console.log( num_A );   // 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略)]

const array_B = [-5, -4, -3, -2, -1];
const num_B = new Int32Array(array_B);
const with_B = num_B.with(-4, 99);
console.log( with_B );  // 出力:Int32Array(5) [-5, 99, -3, -2, -1, (省略)]
console.log( num_B );   // 出力:Int32Array(5) [-5, -4, -3, -2, -1, (省略)]

// 範囲外 (後)
const num_X = new Int32Array(array_A);
try {
  const with_X = num_X.with(10, 99);
} catch(e) {
  console.log(e);  // 例外:RangeError: Invalid typed array index
}

// 範囲外 (前)
const num_Y = new Int32Array(array_B);
try {
  const with_Y = num_Y.with(-10, 99);
} catch(e) {
  console.log(e);  // 例外:RangeError: Invalid typed array index
}

%TypedArray%.prototype.set【要素設定】

メモ

概要

  • 配列内の要素指定配列設定し配列を変更

関連

外部リンク

構文

typedArray.set( source[, offset] )

なし
source (Array | %TypedArray%)設定配列
offset設定開始位置インデックス (0~:末尾からの指定不可 / 省略:0)

RangeError 
    offset<0
    元の範囲を超えた設定 (offsetsourceの要素数要素数)

const array = [0, 1, 2, 3, 4];

// Array
let typedArray = new Int32Array(array);
console.log(typedArray);
// 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
typedArray.set([100, 101]);
console.log(typedArray);
// 出力:Int32Array(5) [100, 101, 2, 3, 4, (省略) ]
typedArray.set([203, 204], 3);
console.log(typedArray);
// 出力:Int32Array(5) [100, 101, 2, 203, 204, (省略) ]

// %TypedArray%
typedArray = new Int32Array(array);
console.log(typedArray);
// 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
const typedArray_B = new Int32Array([900, 901]);
console.log(typedArray_B);
// 出力:Int32Array(2) [900, 901, (省略) ]
typedArray.set(typedArray_B);
console.log(typedArray);
// 出力:Int32Array(5) [900, 901, 2, 3, 4, (省略) ]
const typedArray_C = new Int32Array([903, 904]);
console.log(typedArray_C);
// 出力:Int32Array(2) [903, 904, (省略) ]
typedArray.set(typedArray_C, 3);
console.log(typedArray);
// 出力:Int32Array(5) [900, 901, 2, 903, 904, (省略) ]

// 例外
try {
  typedArray.set([100, 101], -1);
} catch(e) {
  console.log(e); // 例外:RangeError: offset is out of bounds
}
try {
  typedArray.set([104, 105], 4);
} catch(e) {
  console.log(e); // 例外:RangeError: offset is out of bounds
}

%TypedArray%.prototype.fill【指定値設定】

メモ

概要

  • 配列内の要素範囲指定値設定し配列を変更

関連

外部リンク

構文

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

設定後の元配列 (配列変更)
value設定値
start設定開始位置インデックス (詳細は下記参照)
end設定終了位置インデックス (この位置は含まない:詳細は下記参照)

※ startend:処理なし
start備考
省略0
範囲外範囲内に補正
0 ≦ start先頭からの位置インデックス
start < 0 末尾からの位置インデックス (要素数start)
(-1:末尾)
end備考
省略要素数
範囲外範囲内に補正
0 ≦ end 先頭からの位置インデックス
end < 0 末尾からの位置インデックス (要素数end)
(-1:末尾)

const num_plus = [ 0, 1, 2, 3, 4 ];
const num_minus = [ -5, -4, -3, -2, -1 ];

// start:省略・end:省略
const array_A = new Int32Array(num_plus);
const fill_A = array_A.fill(99);
console.log( fill_A );   // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]
console.log( array_A );  // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]

// end:省略
const array_B = new Int32Array(num_plus);
const fill_B = array_B.fill(99, 2);
console.log( fill_B );   // 出力:Int32Array(5) [0, 1, 99, 99, 99, (省略) ]
console.log( array_B );  // 出力:Int32Array(5) [0, 1, 99, 99, 99, (省略) ]

// 省略なし
const array_C = new Int32Array(num_plus);
const fill_C = array_C.fill(99, 1, 4);
console.log( fill_C );   // 出力:Int32Array(5) [0, 99, 99, 99, 4, (省略) ]
console.log( array_C );  // 出力:Int32Array(5) [0, 99, 99, 99, 4, (省略) ]

// start > end
const array_D = new Int32Array(num_plus);
const fill_D = array_D.fill(99, 4, 2);
console.log( fill_D );   // 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
console.log( array_D );  // 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]

// start:負数 end:省略
const array_X = new Int32Array(num_minus);
const fill_X = array_X.fill(99, -2);
console.log( fill_X );   // 出力:Int32Array(5) [-5, -4, -3, 99, 99, (省略) ]
console.log( array_X );  // 出力:Int32Array(5) [-5, -4, -3, 99, 99, (省略) ]

// start:負数 end:負数
const array_Y = new Int32Array(num_minus);
const fill_Y = array_Y.fill(99, -4, -2);
console.log( fill_Y );   // 出力:Int32Array(5) [-5, 99, 99, -2, -1, (省略) ]
console.log( array_Y );  // 出力:Int32Array(5) [-5, 99, 99, -2, -1, (省略) ]

// start:範囲外 end:範囲外
const array_Z = new Int32Array(num_minus);
const fill_Z = array_Z.fill(99, -10, 10);
console.log( fill_Z );   // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]
console.log( array_Z );  // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]

%TypedArray%.prototype.reverse【要素反転 (配列変更あり)】
%TypedArray%.prototype.toReversed【要素反転 (配列変更なし)】

メモ

概要

  • 配列要素反転
    メソッド備考
    reverse【要素反転 (配列変更あり)】元配列の変更あり
    toReversed【要素反転 (配列変更なし)】元配列の変更なし

関連

外部リンク

構文

typedArray.reverse( )
typedArray.toReversed( ) 

要素反転後の配列
    sort:元配列の参照 (元配列変更あり)
    toSorted:新規配列 (元配列変更なし)

※ 空配列の要素反転は、空配列

const array = [1, 2, 3];

// reverse【要素反転 (配列変更あり)】
const num_A = new Int32Array(array);
const rev_A = num_A.reverse();
console.log( rev_A );  // 出力:Int32Array(3) [3, 2, 1, (省略) ]
console.log( num_A );  // 出力:Int32Array(3) [3, 2, 1, (省略) ]

// reverse【要素反転 (配列変更あり)】空配列
const empty_B = new Int32Array([]);
const rev_B = empty_B.reverse();
console.log( rev_B.length );  // 出力:0

// toReversed【要素反転 (配列変更なし)】
const num_X = new Int32Array(array);
const rev_X = num_X.toReversed();
console.log( rev_X );  // 出力:Int32Array(3) [3, 2, 1, (省略) ]
console.log( num_X );  // 出力:Int32Array(3) [1, 2, 3, (省略) ]

// toReversed【要素反転 (配列変更なし)】空配列
const empty_Y = new Int32Array([]);
const rev_Y = empty_Y.toReversed();
console.log( rev_Y.length );  // 出力:0

%TypedArray%.prototype.sort【ソート (配列変更あり)】
%TypedArray%.prototype.toSorted【ソート (配列変更なし)】

メモ

概要

  • 配列要素ソート
    • 比較用コールバック関数の指定可
    • 比較で等しい要素の順序は元のまま
    メソッド備考
    sort【ソート (配列変更あり)】元配列の変更あり
    toSorted【ソート (配列変更なし)】元配列の変更なし

関連

外部リンク

構文

typedArray.sort( [comparefn] )
typedArray.toSorted( [comparefn] ) 

ソート後の配列
    sort:元配列の参照 (元配列変更あり)
    toSorted:新規配列 (元配列変更なし)
comparefn比較用コールバック関数 (詳細は下記参照)
省略:数値比較

TypeError 
comparefn が呼び出し可能な関数オブジェクト以外
コールバック関数 引数名 (例)備考
x要素x
y要素y
戻り値 (比較結果)備考
x < y とみなす
0x = y とみなす
y < x とみなす

// ソート関数 (絶対値で比較)
function func(x, y) {
  const ret = Math.abs(x) - Math.abs(y);
  console.log("x:" + x, "y:" + y, "戻り値:" + ret);
  return ret;
}

const array = [2, 3, -10, 1, 2, 123];
const typedArraySort_A = new Int32Array(array);
const typedArraySort_B = new Int32Array(array);
const typedArraySort_C = new Int32Array(array);
const typedArrayToSorted_A = new Int32Array(array);
const typedArrayToSorted_B = new Int32Array(array);
const typedArrayToSorted_C = new Int32Array(array);

// sort【ソート (配列変更あり)】
let typedArraySort = typedArraySort_A.sort();
console.log(typedArraySort);
// 出力:Int32Array(5) [-10, 1, 2, 2, 3, 123, (省略) ]
console.log(typedArraySort_A);
// 出力:Int32Array(5) [-10, 1, 2, 2, 3, 123, (省略) ]

// sort【ソート (配列変更あり)】関数指定
// 実装によってはx・y逆転 (ソート結果は同じ)
typedArraySort = typedArraySort_B.sort(func);
// 出力:
// x:3 y:-10 戻り値:-7
// x:2 y:3 戻り値:-1
// x:2 y:123 戻り値:-121
// x:1 y:2 戻り値:-1
// x:2 y:1 戻り値:1
// x:2 y:2 戻り値:0
// x:3 y:2 戻り値:1
// x:3 y:123 戻り値:-120
// x:-10 y:123 戻り値:-113
console.log(typedArraySort);
// 出力:Int32Array(6) [1, 2, 2, 3, -10, 123, (省略) ]
console.log(typedArraySort_B);
// 出力:Int32Array(6) [1, 2, 2, 3, -10, 123, (省略) ]

// sort【ソート (配列変更あり)】空配列
const typedArraySort_Empty = new Int32Array([]);
typedArraySort = typedArraySort_Empty.sort();
console.log(typedArraySort.length);
// 出力:0

// sort【ソート (配列変更あり)】関数不正
try {
  typedArraySort = typedArraySort_C.sort(null);
} catch(e) {
  console.log(e);
  // 出力:TypeError: The comparison function must be either a function or undefined
}

// toSorted【ソート (配列変更なし)】
let typedArrayToSorted = typedArrayToSorted_A.toSorted();
console.log(typedArrayToSorted);
// 出力:Int32Array(6) [-10, 1, 2, 2, 3, 123, (省略) ]
console.log(typedArrayToSorted_A);
// 出力:Int32Array(6) [2, 3, -10, 1, 2, 123, (省略) ]

// toSorted【ソート (配列変更なし)】関数指定
// 実装によってはx・y逆転 (ソート結果は同じ)
typedArrayToSorted = typedArrayToSorted_B.toSorted(func);
// 出力:
// x:3 y:-10 戻り値:-7
// x:2 y:3 戻り値:-1
// x:2 y:123 戻り値:-121
// x:1 y:2 戻り値:-1
// x:2 y:1 戻り値:1
// x:2 y:2 戻り値:0
// x:3 y:2 戻り値:1
// x:3 y:123 戻り値:-120
// x:-10 y:123 戻り値:-113
console.log(typedArrayToSorted);
// 出力:Int32Array(6) [1, 2, 2, 3, -10, 123, (省略) ]
console.log(typedArrayToSorted_B);
// 出力:Int32Array(6) [2, 3, -10, 1, 2, 123, (省略) ]

// toSorted【ソート (配列変更なし)】空配列
const typedArrayToSorted_Empty = new Int32Array([]);
typedArrayToSorted = typedArrayToSorted_Empty.toSorted(func);
console.log(typedArrayToSorted.length);
// 出力:0

// toSorted【ソート (配列変更なし)】関数不正
try {
  typedArrayToSorted = typedArrayToSorted_C.toSorted(null);
} catch(e) {
  console.log(e);
  // 出力:TypeError: The comparison function must be either a function or undefined
}