我可以将新数组重新分配给 JavaScript 中的数组变量吗?

Can I reassign a new array to an array variable in JavaScript?

我在 JavaScript 中的数组和在函数内操作它们时遇到问题。
这是 Eloquent JavaScript 一书中的练习。它是关于两个功能:

reverseArrayInPlace()中,我只是调用了reverseArray()来创建一个新数组并重新分配给reverserArrayInPlace()的参数。但是,当我开始显示传递的数组时,重新分配并没有反映到传递的数组中。
我认为 JavaScript 中的数组总是通过引用传递?

我也尝试过将一个数组变量重新分配给另一个数组,如果在函数外完成,它会成功。可能是什么问题?
顺便说一下,练习中禁止使用JavaScript中的reverse()方法。

function reverseArray(array) {
  var new_array = [];
  for (var i = array.length-1; i >= 0; i--)
    new_array.push(array[i]);
  return new_array;
}

function reverseArrayInPlace(array) {
  array = reverseArray(array);
}
 
var r1 = [1,2,3,4,5,6,7,8,9,10];

console.log("r1 ", r1.join(",")); 
// → 1,2,3,4,5,6,7,8,9,10

console.log("reverse of r1 ", reverseArray(r1).join(","));
// → 10,9,8,7,6,5,4,3,2,1

console.log("r1 ", r1.join(","));
// → 1,2,3,4,5,6,7,8,9,10

reverseArrayInPlace(r1);
// the changes are not reflected here

console.log("r1 reversed in place ", r1.join(",")); 
// → still 1,2,3,4,5,6,7,8,9,10;
// this should display r1 = 10,9,8,7,6,5,4,3,2,1

函数 reverseArrayInPlace 的变量 array 是该函数的局部变量。因此,分配给它只会让作用域忘记先前的值,即数组r1.

考虑以下问题:

var a = 5;
function change(a) {
  // Inner 'a'
  a = 0;
  console.log("inside change : ", a);
}

// Outer 'a'
change(a); // → 0
console.log("outside change : ", a); // → 5

可以看出,虽然全局作用域和change的作用域使用相同的名称a,但它们不是相同的变量。分配给 change 内部的 a 永远不会影响 外部 a.

然而
对于一个对象 (或任何属于 Object.prototype 实例的对象,如数组),在函数内部更改属性将有效地在外部更改它。

要完全理解这一点,请仔细阅读以下内容:

var o = {
  arr1: [1, 2, 3],
  arr2: [1, 2, 3],
  str: "foo",
  num: 1
};

console.log("before changing : ", o);

function change(a) {
  // Reassigning to properties of 'a'
  a.arr1[0] = 0;
  a.arr2 = [ "destroyed" ];
  a.str += " bar";
  a.num = a.num * 15;
  
  // Reassigning to 'a'
  a = { change: "Destroyed !" };
  
  console.log("inside change : ", a);
}


change(o); // → { change: "Destroyed !" }
console.log("outside change : ", o); // → initial 'o' with modified properties.

分配给 a = { change: "Destroyed !" }; 仍然没有影响 o。但是对 o 的属性所做的所有更改都已应用。

如您所见,更改 o 的最终结果为:

{
  arr1: [0, 1, 3],     // First item changed.
  arr2: ["destroyed"], // It's a completely new array.
  str: "foo bar",      // " bar" was added.
  num: 15              // 1 * 15
}