在Javascript循环中创建一个新数组是一种不好的做法吗?

时间:2017-11-17 12:39:58

标签: javascript arrays canvas html5-canvas

有时我们需要在循环中使用临时数组来存储数据。例如,当我们需要处理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])。那么在这种情况下创建新阵列是不可避免的吗?

1 个答案:

答案 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与工作人员共享它们(真正共享共享数组只有一个地址)

虽然它们仅限于双打,浮点数,有符号和无符号整数,但它们可以保存任何类型的数据(计算机毕竟只是二进制处理机器),并且对于任何类型的数组工作都会显着提高性能

在循环中创建数组不好。

在循环中创建数组没有任何问题。