就地反转数组为什么不起作用?
Reversing an Array in Place why does it not work?
function reverseArray(array) {
var reversed_array = [];
for(var i = 0; i < array.length; i++) {
reversed_array.unshift(array[i]);
}
return reversed_array;
}
function reverseArrayInPlace(array) {
console.log(array); //[1,2,3,4,5]
array = reverseArray(array);
console.log(arguments); //{0: [5, 4, 3, 2, 1]} this is good.
console.log(array); // [5, 4, 3, 2, 1] this is also good.
return array; //should return [5, 4, 3, 2, 1]
}
console.log(reverseArray(["A", "B", "C"])); //["C", "B", "A"]
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue); // [1, 2, 3, 4, 5] *wrong*
这是我想用 reverseArrayInPlace() 的 return 值覆盖变量 (arrayValue) 的问题,就像 array.reverse() 一样。
这是问题的解决方案
function reverseArrayInPlace(array) {
var half = Math.floor(array.length / 2);
for(var i = 0; i < half; i++) {
var current = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = current;
}
console.log(array); // [5, 4, 3, 2, 1] this is good.
return array; //should return [5, 4, 3, 2, 1]
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue); // [5, 4, 3, 2, 1] *it works!*
如果两个 reverseArrayInPlace() 函数的 return 语句具有相同的值,我不明白为什么这个解决方案可以用新值替换 (arrayValue)。
谁能解释一下我是编程新手,谢谢!
您刚刚调用了 reverseArrayInPlace 而忘记更新 arrayValue:
var arrayValue = [1, 2, 3, 4, 5];
//reverseArrayInPlace(arrayValue);
arrayValue= reverseArrayInPlace(arrayValue);
另一方面,在第二个示例中,数组直接更新,而在第一个示例中,您正在创建一个新的数组实例(使用第三方函数时)
在您的第一个示例中,您声明了一个新变量 var reversed_array = [];
来保存反向数据,然后您从函数中 return 它,但不要使用 return值。
var array = reverseArray(array);
在第二个示例中,reverseArrayInPlace()
函数实际上是在操作传入函数的数组,这就是为什么您可以在传入的 array
变量中看到反转数据的原因。
第二个示例在没有 return array;
的情况下也可以工作,因为它直接在变量中操作数据。
您的第一个代码示例的问题是:
当您调用 reverseArrayInPlace(arrayValue);
时,您并未将该函数调用的结果分配给 arrayValue
,因此 arrayValue
不会改变。
arrayValue = reverseArrayInPlace(arrayValue);
会解决这个问题。
现在说明为什么第一个示例中的 reverseArrayInPlace
函数没有更改实际的数组元素,但第二个示例却更改了:
当您将数组作为变量传递给函数时,它是按引用传递的,而不是按值传递的,因此您实际上是将指针 (array
) 传递给函数,它将起作用with 访问数组的实际内容。此引用仅存在于函数范围内,因此更改它不会影响实际数组。
array = reverseArray(array);
此处您正在更改此引用,但此更改仅适用于 reverseArrayInPlace
函数内部,因此不会更改您的实际数组。但是,在您的第二个示例中,您直接访问原始数组并更改其元素。这就是为什么您的第二个示例有效而您的第一个示例无效的原因。
function reverseArray(array) {
var reversed_array = [];
for(var i = 0; i < array.length; i++) {
reversed_array.unshift(array[i]);
}
return reversed_array;
}
function reverseArrayInPlace(array) {
console.log(array); //[1,2,3,4,5]
array = reverseArray(array);
console.log(arguments); //{0: [5, 4, 3, 2, 1]} this is good.
console.log(array); // [5, 4, 3, 2, 1] this is also good.
return array; //should return [5, 4, 3, 2, 1]
}
console.log(reverseArray(["A", "B", "C"])); //["C", "B", "A"]
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue); // [1, 2, 3, 4, 5] *wrong*
这是我想用 reverseArrayInPlace() 的 return 值覆盖变量 (arrayValue) 的问题,就像 array.reverse() 一样。
这是问题的解决方案
function reverseArrayInPlace(array) {
var half = Math.floor(array.length / 2);
for(var i = 0; i < half; i++) {
var current = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = current;
}
console.log(array); // [5, 4, 3, 2, 1] this is good.
return array; //should return [5, 4, 3, 2, 1]
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue); // [5, 4, 3, 2, 1] *it works!*
如果两个 reverseArrayInPlace() 函数的 return 语句具有相同的值,我不明白为什么这个解决方案可以用新值替换 (arrayValue)。
谁能解释一下我是编程新手,谢谢!
您刚刚调用了 reverseArrayInPlace 而忘记更新 arrayValue:
var arrayValue = [1, 2, 3, 4, 5];
//reverseArrayInPlace(arrayValue);
arrayValue= reverseArrayInPlace(arrayValue);
另一方面,在第二个示例中,数组直接更新,而在第一个示例中,您正在创建一个新的数组实例(使用第三方函数时)
在您的第一个示例中,您声明了一个新变量 var reversed_array = [];
来保存反向数据,然后您从函数中 return 它,但不要使用 return值。
var array = reverseArray(array);
在第二个示例中,reverseArrayInPlace()
函数实际上是在操作传入函数的数组,这就是为什么您可以在传入的 array
变量中看到反转数据的原因。
第二个示例在没有 return array;
的情况下也可以工作,因为它直接在变量中操作数据。
您的第一个代码示例的问题是:
当您调用 reverseArrayInPlace(arrayValue);
时,您并未将该函数调用的结果分配给 arrayValue
,因此 arrayValue
不会改变。
arrayValue = reverseArrayInPlace(arrayValue);
会解决这个问题。
现在说明为什么第一个示例中的 reverseArrayInPlace
函数没有更改实际的数组元素,但第二个示例却更改了:
当您将数组作为变量传递给函数时,它是按引用传递的,而不是按值传递的,因此您实际上是将指针 (array
) 传递给函数,它将起作用with 访问数组的实际内容。此引用仅存在于函数范围内,因此更改它不会影响实际数组。
array = reverseArray(array);
此处您正在更改此引用,但此更改仅适用于 reverseArrayInPlace
函数内部,因此不会更改您的实际数组。但是,在您的第二个示例中,您直接访问原始数组并更改其元素。这就是为什么您的第二个示例有效而您的第一个示例无效的原因。