【发布时间】:2018-07-30 07:46:47
【问题描述】:
我对 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
【问题讨论】:
-
JavaScript only 具有 Pass-By-Value(仍然允许 Call-By-Object-Sharing)。请在之前使用标签“Pass-By-Reference”搜索并清除这种混淆。
-
无论如何,更改“没有反映出来”,因为提供的对象 没有变异(并且分配给参数对调用者没有影响因为 JavaScript only 有 Pass-By-Value;见上文。)
-
reverseArray返回一个新数组 ...array = reverseArray(array);将数组的 local(参数)引用分配给这个新数组,从而打破对传入数组,但不会更改传入的数组,因为它不会 -
公平地说,@user2864740 ...谁想说
pass-by-value a reference to an object:p -
@JaromandaX 这就是我说“通过对象共享调用”的原因。它传达了预期的行为/语义并避免了“引用”的整个概念 - 在 ECMAScript 中 not 将其定义为“对对象的引用”并且定义不同(或根本没有)其他语言:}
标签: javascript arrays pass-by-value