将数组中字符串元素的引用推送到新的字符串数组中

时间:2017-09-13 07:08:22

标签: javascript arrays performance optimization

给出以下代码:

    var old_Array =["One","Two","..."];
    var len = old_Array .length;
    var new_Array =[];
    for(var i=0;i<len;++i)
    {
      new_Array.push(old_Array [i]); // ----- [1]
    }

[1] new_Array后面的字符串填充。

  1. 每个元素实际上是对字符串元素的引用 old_Array,或只是每个字符串元素的副本?
  2. javascript解释器/编译器是否优化了行 - [1] 推送old_Array
  3. 中每个字符串元素的引用

2 个答案:

答案 0 :(得分:0)

第一个问题的答案:每个元素只是旧数组的每个字符串元素的副本。 如果数组包含对象引用,则引用将复制到新数组中。 (在这种情况下,字符串和数字等基元类型按值复制。)

回答第二个问题:不,javascript解释器不会通过推送old_Array中每个字符串元素的引用来优化行[1]。

复制数组的更快更好的方法是:

var new_Array = old_Array.slice();

它克隆旧数组并返回对新数组的引用。

答案 1 :(得分:0)

有趣的问题。字符串是不可变的,这意味着一旦它们被写入内存就无法更改。所以当你喜欢的时候

var s2 = s.substr(0, 3);

s2现在是一个新字符串,但它不会复制到新的内存位置,而只是表示为s中的范围。因此,根据您的问题,从字符串数组中复制字符串不应为新字符串分配额外的内存。但是当不再需要带有原始字符串的数组时,GC应该足够聪明,以决定从哪个项中删除并保留在该数组分配的内存中。

我想实现会根据JS引擎而改变。这里有关于此主题的MDN的一些信息。