「JavaScript/Array」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
Ef3 (トーク | 投稿記録)
→‎Array.prototype.slice(start, end): 浅いコピーは、微差ですがスプレッド構文の方が早く、意図もはっきりします。
134 行
 
==== Array.prototype.slice(start, end) ====
startからend番目'''の1つ前'''の配列要素を取得する。
引数に負の数を指定すると、配列の末尾からのインデックスでデータの取得を行える<ref>[https://tc39.es/ecma262/#sec-array.prototype.slice ECMA-262::23.1.3.25 Array.prototype.slice (start, end)]</ref>
end側にを省略する、あるいは <var>undefined</var> を指定すればstartから配列の末尾までを取得できるはずだが、現在の段階では実装に依存
さらに start も省略する、あるいは 0 を指定すると浅いコピー(shallow copy) を取得できます。
<source lang="javascript">
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
console.log( arr.slice( 3, 8 ) ); // d,e,f,g,hりま
console.log( arr.slice( -5, -1 ) ); // g,h,i,jりま
</source>
 
console.log( arr.slice( 3, undefined ) ); // 配列の4番目から最後までりま
end側にundefinedを指定すればstartから配列の末尾までを取得できるはずだが、現在の段階では実装に依存する。
console.log( arr.slice( 3 ) ); // d,e,f,g,h,i,j,k が返ります正しき標準仕様外
 
console.log(arr.slice(0)); // a,b,c,d,e,f,g,h,i,j,k が返ります
console.log(arr.slice()); // a,b,c,d,e,f,g,h,i,j,k が返ります
</source>
最後の、浅いコピー(shallow copy) を取得する用途で slice() を使うことが多いですが、、
<source lang="javascript">
const a = [];
console.log( arr.slice( 3, undefined ) ); // 配列の4番目から最後までを返す
for (let i = 0; i < 999; i++)
console.log( arr.slice( 3 ) ); // d,e,f,g,h,i,j,k が返ります正しき標準仕様外
a.push(i);
 
console.time("dhry");
for (let i = 0; i < 999999; i++)
;
console.timeEnd("dhry");
 
console.time("slice");
for (let i = 0; i < 999999; i++)
v = a.slice(0);
console.timeEnd("slice");
 
console.time("spred");
for (let i = 0; i < 999999; i++)
v = [...a];
console.timeEnd("spred");
/* dhry: 4.679931640625 ms
* slice: 1456.339111328125 ms
* spred: 1302.201904296875 ms
*/
</source>
微差ですがスプレッド構文の方が早く、意図もはっきりします。
 
==== Array.prototype.some() ====