函数调用后array1.concat(array2)不持久的影响



这行得通:

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);//[];

不起作用。对于work,我的意思是在函数调用之后所做的更改会持续存在。

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

所以我想知道,是否有concat的持久版本?还是我必须手动将所有元素从一个数组推入另一个数组?

编辑:你们所有人都建议返回新创建的数组:这几乎正是我不想要的。如果我想这么做,我就不会出这个问题了。我当然不会在结束时特别要求concat的持久版本

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

这是因为函数参数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,除了它修改了原始数组。

最新更新