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

时间:2018-02-20 02:20:12

标签: javascript arrays pass-by-value

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

  • reverseArray():返回 new 数组,该数组与参数数组相反。
  • reverseArrayInPlace():只需反转参数数组本身。

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




1 个答案:

答案 0 :(得分:0)

函数array的变量reverseArrayInPlace是该函数的本地变量。因此,分配它只会使范围忘记先前的值,即数组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,但它们不是相同的变量。在a 内分配change绝不会影响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
}