关于javascript:为什么=无法更改数组,但推送可以吗?

Why = cannot change the array, but push can?

本问题已经有最佳答案,请猛点这里访问。

我想使用=在函数中启动一个数组。但是,=不能更改数组,但是push可以。

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

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

在这种情况下,我怎样才能让=工作?

1
2
3
4
5
6
7
8
9
10
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?控制台


因此,发生这种情况的原因是,您要将局部变量分配给新数组,而在分配之前,局部变量保留了传入数组的值。

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

要扩展,从被调用开始:

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

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

1
function init(array) {

在此之后,将两个值推送到EDOCX1的值(0),这是传入EDOCX1的值(0)。

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

这就是发生混乱的地方。局部变量array(仍保留传入array的值)的值已更改为新数组。结果是,局部变量array不再持有传入array的值,而现在持有['a','b']的值。

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

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


1
2
3
4
function init(array) {
  array.push('a');
  array.push('b');
}