副作用/改变传递给函数的全局变量
Side effect/ changing global varaibles that pass into a function
如果有人问过这个问题,但我似乎找不到它,请原谅我。
我正在尝试创建一个数组并将其反转(不使用反转)
这段代码完美无缺:
function reverseArrayInPlace(array) {
for (var i = 0; i < Math.floor(array.length / 2); i++) {
var old = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = old;
}
return array;
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]
如您所见,它在 array
中输入一个,执行一些逻辑,并且 returns 同样改变 array
。
不过,我不明白为什么这段代码不起作用:
var some_array = [6,7,8,9,10];
function reverseArrayInPlace(array) {
var replacement_array = [];
for (var i = 0; i < some_array.length; i++)
replacement_array.unshift(array[i])
array = replacement_array;
return array;
}
reverseArrayInPlace(some_array);
console.log(some_array);
// → [ 6, 7, 8, 9, 10 ]
此代码还接收一个数组,执行一些逻辑(和赋值)并 returns 返回一个数组。为什么它不像第一个那样改变全局变量?有什么办法可以改成这样吗?
直接影响全局:
var some_array = [6,7,8,9,10];
function reverseArrayInPlace(array) {
var replacement_array = [];
for (var i = 0; i < array.length; i++)
replacement_array.unshift(array[i]);
for (var i = 0; i < array.length; i++)
array[i] = replacement_array[i];
}
reverseArrayInPlace(some_array);
alert(some_array);
您不需要 return 数组。
好的,你需要这个:
function reverseArrayInPlace(array) {
replacement_array = [];
for (var i = 0; i <array.length; i++)
{
replacement_array.unshift(array[i])
}
for(var i = 0; i <array.length; i++){
array[i]=replacement_array[i]
}
return array;
}
some_array = [6,7,8,9,10];
reverseArrayInPlace(some_array)
console.log(some_array)
替换变量的内容即可。
单步执行代码:
function reverseArrayInPlace(array) {
var replacement_array = [];
for (var i = 0; i < some_array.length; i++)
replacement_array.unshift(array[i])
此时您已经创建了一个与原始数组相反的新数组。
array = replacement_array;
给array
赋一个新值不会改变原来的数组;只有可变数组方法或元素取消引用可以影响它。
return array;
}
你在这里返回新数组,所以你可以在函数外执行赋值:
some_array = reverseArrayInPlace(some_array);
console.log(some_array);
但是,这不再符合就地修改数组的条件;你可以使用 unshift()
和 splice()
不过:
for (var i = 1, n = array.length; i < n; ++i) {
array.unshift(array.splice(i, 1)[0]);
}
如果有人问过这个问题,但我似乎找不到它,请原谅我。
我正在尝试创建一个数组并将其反转(不使用反转) 这段代码完美无缺:
function reverseArrayInPlace(array) {
for (var i = 0; i < Math.floor(array.length / 2); i++) {
var old = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = old;
}
return array;
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]
如您所见,它在 array
中输入一个,执行一些逻辑,并且 returns 同样改变 array
。
不过,我不明白为什么这段代码不起作用:
var some_array = [6,7,8,9,10];
function reverseArrayInPlace(array) {
var replacement_array = [];
for (var i = 0; i < some_array.length; i++)
replacement_array.unshift(array[i])
array = replacement_array;
return array;
}
reverseArrayInPlace(some_array);
console.log(some_array);
// → [ 6, 7, 8, 9, 10 ]
此代码还接收一个数组,执行一些逻辑(和赋值)并 returns 返回一个数组。为什么它不像第一个那样改变全局变量?有什么办法可以改成这样吗?
直接影响全局:
var some_array = [6,7,8,9,10];
function reverseArrayInPlace(array) {
var replacement_array = [];
for (var i = 0; i < array.length; i++)
replacement_array.unshift(array[i]);
for (var i = 0; i < array.length; i++)
array[i] = replacement_array[i];
}
reverseArrayInPlace(some_array);
alert(some_array);
您不需要 return 数组。
好的,你需要这个:
function reverseArrayInPlace(array) {
replacement_array = [];
for (var i = 0; i <array.length; i++)
{
replacement_array.unshift(array[i])
}
for(var i = 0; i <array.length; i++){
array[i]=replacement_array[i]
}
return array;
}
some_array = [6,7,8,9,10];
reverseArrayInPlace(some_array)
console.log(some_array)
替换变量的内容即可。
单步执行代码:
function reverseArrayInPlace(array) {
var replacement_array = [];
for (var i = 0; i < some_array.length; i++)
replacement_array.unshift(array[i])
此时您已经创建了一个与原始数组相反的新数组。
array = replacement_array;
给array
赋一个新值不会改变原来的数组;只有可变数组方法或元素取消引用可以影响它。
return array;
}
你在这里返回新数组,所以你可以在函数外执行赋值:
some_array = reverseArrayInPlace(some_array);
console.log(some_array);
但是,这不再符合就地修改数组的条件;你可以使用 unshift()
和 splice()
不过:
for (var i = 1, n = array.length; i < n; ++i) {
array.unshift(array.splice(i, 1)[0]);
}