给出以下代码:
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
后面的字符串填充。
old_Array,
或只是每个字符串元素的副本?old_Array
?答案 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的一些信息。