我可以将新数组重新分配给 JavaScript 中的数组变量吗?
Can I reassign a new array to an array variable in JavaScript?
我在 JavaScript 中的数组和在函数内操作它们时遇到问题。
这是 Eloquent JavaScript 一书中的练习。它是关于两个功能:
reverseArray()
: returns 一个 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
函数 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
}
我在 JavaScript 中的数组和在函数内操作它们时遇到问题。
这是 Eloquent JavaScript 一书中的练习。它是关于两个功能:
reverseArray()
: returns 一个 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
函数 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
}