【发布时间】:2020-11-13 19:05:13
【问题描述】:
我有一个反转数组的函数:
function reverseArray(array) {
for(let i = 0; i <= Math.floor(array.length / 2); i++) {
let old = array[array.length - 1 - i];
array[array.length - 1 - i] = array[i];
array[i] = old;
}
return array;
}
以及一个创建本地范围数组并以相反顺序推送值的函数:
function reverseArr(arr) {
let output = [];
for(let i of arr) {
output.unshift(i);
}
arr = output;
return arr;
}
假设有一个元素:
let arrayValue = [1, 2, 3, 4, 5];
如果我以 arrayValue 作为参数调用第一个函数,arrayValue 会改变:
reverseArray(arrayValue); // [5, 4, 3, 2, 1]
console.log(arrayValue); // [5, 4, 3, 2, 1]
但是,如果我使用 arrayValue 调用第二个函数:
reverseArr(arrayValue); //[5, 4, 3, 2, 1]
console.log(arrayValue); //[1, 2, 3, 4, 5]
即使我在返回之前将反转的值分配给参数,arrayValue 也不会改变:
arr = output;
谁能解释一下为什么?
提前致谢。
【问题讨论】:
-
我不认为
unshift做你认为它做的事。阅读developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。 -
另见here,它描述了使用
push的更好方法。 -
@RobertHarvey 嗯.... unshift() 是在这里使用的正确方法.... OP 正在反转一个数组,因此它附加到前面,您的建议是将它添加到末尾.....所以OP会得到相同的数组顺序,因为循环不会倒退......
-
JS 是 pass-by-value,当您执行
arr = output时,您只是重新分配了局部变量arr。您不会替换它曾经引用的数组,也不会影响仍然引用该数组的其他变量 (arrayValue)。在您的第一个示例中,您正在直接改变该数组。
标签: javascript arrays function