为什么=无法更改数组,但推送可以?

时间:2016-06-19 05:04:20

标签: javascript

我想使用=在函数中启动数组。但是,=无法更改数组,但push可以。

我希望它等于["a", "b"]。但现在结果是["1", "2"]

我尝试了arr = ['a', 'b'];arr = ['a', 'b'].slice();。但两者都不起作用。

在这种情况下如何让=工作?

var array = [];

init(array);
console.log(array);

function init(arr) {
  arr.push('1');
  arr.push('2');
  arr = ['a', 'b'];
}

https://jsbin.com/kiveyu/4/edit?js,console

2 个答案:

答案 0 :(得分:3)

所以发生这种情况的原因是因为你正在为新数组分配局部变量,而在赋值之前,局部变量保持传入数组的值。

该参数保存对传入的值的引用。但是,该参数仍然是局部变量。写入该变量只会修改局部变量,并且会丢失所持有的引用。

扩展,从被称为:

init(array);//call function init with value array

接下来,在实例化时创建上下文环境,它保存一个局部变量array,并且该变量的值与传入的array的值相同(在您的示例中,它们具有同名)

function init(array) {

在此之后,两个值将被推送到array的值,这是传入array的值。

array.push('1');
array.push('2');

这里似乎发生了混乱。局部变量array(仍保留传入的array)将其值更改为新数组。结果是局部变量array不再保留传入array的值,但现在保持['a','b']的值。

array = ['a', 'b'];

这就是为什么看起来你不能通过赋值更改数组 - 因为你在该范围内唯一可以访问的是关于原始数组的局部变量。

答案 1 :(得分:-2)

function init(array) {
  array.push('a');
  array.push('b');
}