有时我们需要在循环中使用临时数组来存储数据。例如,当我们需要处理2维数组时。但是我不确定在循环中创建一个新数组是不是一个坏习惯,特别是如果我需要经常这样做,比如在动画中。
for (let i = 0; i < 10000; i++) {
const temp = [];
for (let j = 0; j < 10; j++) {
temp.push(j);
}
arr.push(temp);
}
如果这是一个变量,我应该能够使用全局变量并为其重新赋值。所以我尝试使用全局数组并使用temp.length = 0
清除数组,但是因为存储了数组的引用,所以数据将全部成为最后推送的值。我还尝试了全局const temp = new Set()
但是当我将temp
集推入arr
数组时,它将是arr.push([...temp])
。那么在这种情况下创建新阵列是不可避免的吗?
答案 0 :(得分:0)
TypedArrays应始终是第一个选项。与标准阵列相比,它们具有巨大的性能和内存优势。
创建数组数组的最快方法是
var i,j,b,a = [];
for (i = 0; i < 100000; i += 1) {
a[i] = b = new Float64Array(10);
for (j = 0; j < 10; j += 1) {
b[j] = j;
}
}
以634为基准,比最快的Array
方法快了5.5倍
var i,j,b,a = [];
for (i = 0; i < 100000; i += 1) {
a[i] = b = [];
for (j = 0; j < 10; j += 1) {
b[j] = j;
}
}
其中基准3664是另一个比
快3.4倍的基准const arr = [...Array(10000)];
for (let i = 0; i < arr.length; i ++) {
arr[i] = [...Array(10).keys()]
}
这个基准是悲伤的12352
类型化数组是固定大小,声明时它们预先填充为零。它们永远不会稀疏,如果使用得好可以消除GC开销。
使用Atomics
,您可以通过SharedArrayBuffers
与工作人员共享它们(真正共享共享数组只有一个地址)
虽然它们仅限于双打,浮点数,有符号和无符号整数,但它们可以保存任何类型的数据(计算机毕竟只是二进制处理机器),并且对于任何类型的数组工作都会显着提高性能
在循环中创建数组没有任何问题。