我在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

答案 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
}