【发布时间】:2017-12-13 16:26:43
【问题描述】:
我正在尝试 JavaScript 挑战。不要使用标准数组reverse 方法,而是创建一个新函数来修改作为参数给出的数组并反转其元素。示例如下:
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]
但是,我创建了这个函数但它不起作用:
function reverseArrayInPlace(arr) {
var newArr = [];
for (var i = arr.length - 1; i >= 0; i--) {
newArr.push(arr[i]);
}
arr = newArr; //This reverse arr successfully but won't work when called
return arr;
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [1, 2, 3, 4, 5], why? The arr variable above returned [5, 4, 3, 2, 1] but not here
这就是答案,它奏效了:
function reverseArrayInPlace(arr) {
for (var i = 0; i < Math.floor(arr.length / 2); i++) {
var old = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = old;
}
return arr;
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]
我的方法有什么问题。我没有得到的是console.log 确实输出了正确的相反顺序,但它仍然会在输出时显示原始的arrayValue。有人可以向我解释其中的区别吗?
【问题讨论】:
-
var newArr = [];-> 你不再使用原始数组,而是一个新的对象引用,arr更新为指向函数内的本地,而不是外部的引用的功能。 -
您正在创建新数组,您没有更改原始数组...
-
来自维基百科:在计算机科学中,就地算法是一种不使用辅助数据结构来转换输入的算法。然而,辅助变量允许有少量的额外存储空间。就地算法仅通过替换或交换元素来更新输入序列。 -> 所以你必须修改传递的原始数组,而不是分配一个新的。由于 arr 在函数内部,因此它与外部的 arr 不同。传递给函数的 arr 参数(它是一个引用,而不是全部)占用与 arr 外部不同的内存
标签: javascript