函数调用后,array1.concat(array2)的效果不会持久化

时间:2014-08-11 17:21:11

标签: javascript pass-by-reference concat

这有效:

var f = function(a){
   a.push(1);
};
var a = [];
f(a);
console.log(a);//[1];

但是这个:

var f = function(a){
   a = a.concat([1]);
};
var a = [];
f(a);
console.log(a);//[];

不起作用。有了工作,我的意思是在函数调用之后所做的更改仍然存在。

现在我意识到这很可能与传递的参数有关,并且作为值的参考,意味着在函数之后参考的变化(即分配新对象)不会持续存在调用

所以我想知道,是否有持续版本的concat?或者我是否必须将所有元素从一个数组推送到另一个数组?

编辑:你们所有人都建议返回新创建的阵列:这几乎就是我不想要的。如果我想这样做,我就不会创造这个问题。而且我当然不会特意要求持久版本的concat。

2 个答案:

答案 0 :(得分:3)

concat返回一个新数组,它不会改变源数组。

var f = function(a){
   return a.concat([1]);
};

var a = f([]);

console.log(a);//[1];

如果你想改变数组,只需使用push.apply将数组元素作为单个参数传递给push函数。

 var f = function(a) {
     a.push.apply(a, [1]);
 };

 var a = [];

 f(a);

 console.log(a); //1

答案 1 :(得分:2)

这是因为函数参数a与外部作用域中声明的变量a不同。为参数a分配新值时,它对外部变量没有影响。

a = a.concat([1]);

相反,只需返回新数组,并使用外部作用域中的返回值,如下所示:

var f = function(a){
   return a.concat([1]);
};
var a = [];
a = f(a);

或者考虑使用push这样:

var f = function(a){
   Array.prototype.push.apply(a, [1, 2, 3]);
};

这会将多个值推送到源数组上,因此除了修改原始数组外,它几乎等同于concat