【问题标题】:Is creating a new array in a loop in Javascript a bad practice?在 Javascript 的循环中创建一个新数组是一种不好的做法吗?
【发布时间】:2018-05-01 05:51:46
【问题描述】:

有时我们需要在循环中使用临时数组来存储数据。例如,当我们需要处理二维数组时。但我不确定在循环中创建新数组是否是一种不好的做法,特别是如果我需要经常这样做,例如在动画中。

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])。那么在这种情况下创建新数组是不可避免的吗?

【问题讨论】:

  • @Adam 你试过吗?我没有重新分配。仔细阅读我的标题。我正在创建一个新数组。
  • 好吧,如果你想要一个包含 10000 个数组的数组,那么是的,创建 10000 个数组肯定是不可避免的(最好在循环中这样做)。拥有 1000 个数组是否是一种不好的做法取决于它们应该解决的问题。
  • 这是否是一个问题实际上取决于您实际在做什么,以及您是否遇到了实际的性能问题。如果你这样做了,那么你将不得不考虑重构代码以查看是否有任何替代结构,但正如@Bergi 所说 - 如果你需要一个数组数组,你需要以一种或另一种方式创建它们。跨度>
  • @JamesThorpe 是的,我同意我需要考虑的第一件事是另一种数据结构。但有时我会使用其他库,所以我必须坚持使用它们的数据结构。
  • 您是否愿意为您的动画提供一个更清晰的示例(也许是一个 jsfiddle,以便我们可以看到动画,代码在实践中)?我认为 Javascript 中不会有一个通用的答案来避免创建数组或数组(然后它将成为标准)。因此,您可能只会收到针对您的具体案例的答复

标签: javascript arrays canvas html5-canvas


【解决方案1】:

类型化数组

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 为基准,比 3664 快 3.4 倍

const arr = [...Array(10000)];
for (let i = 0; i < arr.length; i ++) {
  arr[i] = [...Array(10).keys()]
}

这是一个悲伤的 12352 的基准

类型化数组是固定大小的,并且在声明它们时预填充为零。它们永远不会变得稀疏,如果使用得当可以消除 GC 开销。

使用Atomics,您可以通过SharedArrayBuffers与工人共享它们(真正共享一个共享数组只有一个地址)

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

在循环中创建数组不好。

在循环中创建数组没有错。

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多