【问题标题】:Memory allocation for strings and arrays in JavaScriptJavaScript 中字符串和数组的内存分配
【发布时间】:2016-06-30 12:58:10
【问题描述】:

第一个函数:

  1. 将字符串和整数连接成一个字符串。
  2. 将结果字符串插入数组。
  3. 将所有数组的字符串合并为一个字符串。

第二个函数做同样的事情,但不是串联,而是在数组中插入 2 个字符串。

问题:你如何确定哪个函数会分配更少的内存? 还有一个问题:我们将有多少个字符串用于第一个函数的内存(每次迭代)?例如,对于第一次迭代,我们将只有“a0”或“a0”、“a”和“0”?

function joinLetters() {
    var arr = [];

    for(var i = 0; i < 10000; i++) {
        arr.push('a' + i);
    }
    return arr.join('');
}

function joinLetters2() {
    var arr = [];

    for(var i = 0; i < 10000; i++) {
        arr.push('a');
        arr.push(i.toString());
    }
    return arr.join('');
}

【问题讨论】:

  • 函数不分配内存...执行它们,通常以因执行环境而异的方式。由于 StackOverflow 是永远的,所以这个问题也应该如此,但我们无法预测未来,例如推断第一个函数使用更少的内存是否仍然有效。
  • 如果您觉得我的回答有用,请您接受/投票吗?

标签: javascript arrays string debugging memory


【解决方案1】:

内部循环中的joinLetters 进行一次推送,joinLetters2 则改为进行两次push

所以您将在第一种情况下拥有arr.length = 10000,而在第二种情况下拥有arr.length = 20000

当然,您可以预期第二个函数比第一个函数更昂贵。

【讨论】:

  • 谢谢!还有一个问题:我们将拥有第一个函数的内存中有多少个字符串(每次迭代)?例如,对于第一次迭代,我们将只有“a0”或“a0”、“a”和“0”?
  • 很明显,如果你做一个单一的推送,你将有一个元素,而不是a,0,...。如有此类问题,请参阅documentation
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2022-01-17
  • 2016-03-25
  • 2014-01-05
  • 1970-01-01
  • 2016-09-29
  • 2011-10-22
相关资源
最近更新 更多