我正在学习 JavaScript。其中一个练习是编写一个函数,覆盖作为参数传入的数组中的值。我的解决方案在函数内有效,但它似乎没有从函数传回。另外,如果我做不在函数中的同样的事情,它也会起作用。在弄清楚问题所在之后,我编写了解决方案的简化版本和有效版本。但我还是不明白为什么一个有效,一个无效。有人可以解释一下吗?
谢谢
function reverseArrayInPlace(ary){
// This version is successful
ary[0] = 5;
ary[1] = 4;
ary[2] = 3;
ary[3] = 2;
ary[4] = 1;
console.log("Within reverseArrayInPlace: " + ary);
return ary;
}
function reverseArrayInPlace2(ary){
// This version is not successful
ary = [5, 4, 3, 2, 1];
console.log("Within reverseArrayInPlace2: " + ary);
return ary;
}
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log("After reverseArrayInPlace: " + arrayValue);
var arrayValue2 = [1, 2, 3, 4, 5];
reverseArrayInPlace2(arrayValue2);
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);
// But this works.
arrayValue2 = [5, 4, 3, 2, 1];
console.log("After outer replace of arrayValue2: " + arrayValue2);
结果:
在reverseArrayInPlace内:5,4,3,2,1
reverseArrayInPlace 之后:5,4,3,2,1
在reverseArrayInPlace2内:5,4,3,2,1
reverseArrayInPlace2之后 - 为什么顺序错误?:1,2,3,4,5
外部替换 arrayValue2 后:5,4,3,2,1
最佳答案
JavaScript 是一种按值传递(或按值调用,如果您愿意的话)语言。在函数内部为函数参数分配新值对外界没有影响。但是,使用对对象的传入引用来修改属性值确实会影响外部世界。您传入对数组的引用,然后该函数可以使用该引用将新值填充到数组的元素中。
您的函数返回修改后的数组,但您的调用环境会忽略它。更改您的测试:
var arrayValue2 = [1, 2, 3, 4, 5];
arrayValue2 = reverseArrayInPlace2(arrayValue2);
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);
关于javascript - 为什么在函数中覆盖整个数组不会替换它,但逐个元素覆盖却可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909838/