我正在尝试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
。有人可以向我解释一下这个区别吗?
答案 0 :(得分:1)
分配要求修改数组,而不是分配新的数组/重新分配引用。这意味着您必须修改作为参数传递的变量,而不为返回的变量分配新内存(因此您没有其他内存引用)。您从函数返回的值未分配给原始变量,因为它属于另一个范围,并且未执行返回值的赋值(即arrayValue = reverseArrayInPlace(arrayValue)
)
关于到位algorythm,来自维基百科:在计算机科学中,就地算法是一种使用无辅助数据结构转换输入的算法。但是,辅助变量允许少量额外存储空间。就地算法仅通过替换或交换元素来更新输入序列。 - &GT;所以你必须修改传递的原始数组,而不是分配新的数组。由于arr是内部功能,因此与外部的arr不同。传递给函数的arr参数(这是一个引用,而不是整个事物)占用了外面的不同内存
答案 1 :(得分:-1)
你的脚本有效。如果您尝试显示如下内容:
<p id="result"></p>
<script>
document.getElementById("result").innerHTML = reverseArrayInPlace(arrayValue);
</script>
它有效