1

Javascript我们将函数中定义的本地数组作为参数传递给不同的函数时,它将在上游修改数组,除非数组为空 例如foo对不同的函数说bar

var foo = function() { 
  var x = [9];  //Array is not empty
  bar(x);
  console.log("x =>",x);
}; 
var bar = function(x) {x[0] = 1;};
foo(); // x => [1]

的输出x => [1],如果数组为空并且在被调用函数中被修改,bar它不会更新调用函数中的数组foo

var foo = function(){ 
  var x = []; //Array is empty
  bar(x); 
  console.log("x =>",x); }; 
var bar = function(x) {x = [1];};
foo(); // x => []

但是如果我们为什么使用数组推送,它如何更新中的空数组foo

var foo = function(){ var x = []; bar(x); console.log("x =>",x); }; 
var bar = function(x) {x.push(3);};
foo(); // x => [3]
4

2 回答 2

2

在内部bar,只需为变量x = [1]分配一个新值x。该变量是函数的本地变量,这对您用来传递参数的变量没有影响(想象一下,您没有使用变量来传递值,而是使用文字,例如bar([1,2]);)。

x.push(3)另一方面,分配新值。它就地修改数组。这是有效的,因为数组是可变的。

同样,通过为数组的第一个位置分配一个新值来就地x[0] = 1;更改数组。

更简单的例子:

var foo = [1];
var bar = foo;

bar.push(2);
console.log(foo); // shows [1, 2]

bar = 42;
console.log(foo); // still shows [1, 2]

foobar在开头引用相同的数组,因此您可以使用任一变量修改数组。稍后我们为 分配一个新值bar。这对 的值没有影响foo,它仍然引用数组。

无论您是否将值传递给函数都没有区别。


正如已经指出的,空数组和非空数组之间没有区别。您声称为第一个示例获得的结果不正确。输出将是[9].

于 2013-04-30T19:23:54.060 回答
1

在第二个和第三个示例中,x是一个包含对内存中 Array 对象的引用的变量。

在第二个示例中,bar将变量重新分配x给一个新的 Array 对象,即[1]. 这对原始内存中的 Array 对象没有影响。您所做的只是重新分配一个变量。

在第三个示例中,您调用x.push: 这会调用变量“x”引用的 Array 对象的 push 方法,从而更改该数组。

这里的关键概念是:

  1. 变量和它所引用的对象之间的差异。如果您重新分配它,相同的变量将指向一个新对象。
  2. 在javascript中,当你调用一个函数并传入一个对象时,你传递的是对该对象的引用,你对它所做的任何事情都会影响原始对象。

正如 Felix 所指出的,第一个示例的行为与第二个示例相同。

于 2013-04-30T19:34:58.383 回答