配列を正確に検証する方法
オブジェクトの深いコピーが必要になりました。
ライブラリを一切使用していない状況なので、直接実装しています。🤣
その中で、配列を正確に確認する方法として instanceof と Array.isArray のどちらが賢明な方法かを考えてみましょう。
Note
ES5 から Array.isArray が追加されました。
結論、どちらを使うべきでしょうか?
instanceof Array が異なる結果を返すのは、iframe でデザインされたコードの外に限られます。
コードの統一性を重視するのであれば、instanceof Array を使用すれば良いでしょう。
ただし、iframe を使用する場合は Array.isArray を使用することをお勧めします。
パフォーマンスに有意義な差をつけるために過剰な実験を行いましたが、実際の使用環境では有意義な差を感じることはできませんでした。
パフォーマンステスト
空の配列を100億回検証するパフォーマンステストを Edge と Deno で実施しました。
/** @type {Array<Array<number>>} */
const arr = [];
const time = 10_000_000_000;
// 1st
console.time('Array.isArray');
for (let i = 0; i < time; i++) {
Array.isArray(arr);
}
console.timeEnd('Array.isArray');
// 2nd
console.time('instanceof');
for (let i = 0; i < time; i++) {
arr instanceof Array;
}
console.timeEnd('instanceof');
Array.polyfillIsArray = function (obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
// 3rd
console.time('Array.polyfillIsArray');
for (let i = 0; i < time; i++) {
Array.polyfillIsArray(arr);
}
console.timeEnd('Array.polyfillIsArray');
結果
数値が低いほどパフォーマンスが良いです。
有意義な結果を得るために100億回実行した結果、Array.isArray が最も速い結果となりました。
なぜ Array.isArray が速いのか?
理由は Array.isArray が内部的に最適化されているからです。
なぜ instanceof が遅いのか?
instanceof はオブジェクトのプロトタイプチェーンを確認します。
つまり、親から祖先まで検証します。
なぜ Array.polyfillIsArray が遅いのか?
Array.polyfillIsArray が遅い理由は、この方法が Object.prototype.toString メソッドを呼び出し、結果の文字列を検査する過程を経るためです。
この過程は組み込み関数 Array.isArray よりも多くの演算を必要とするため、相対的に遅くなる可能性があります。