Javascript 为什么在一个函数中覆盖整个数组并不能替换它,但逐个元素覆盖却能替换它?
我正在学习javascript。其中一个练习是编写一个函数,该函数覆盖作为参数传入的数组中的值。我的解决方案在函数中起作用,但似乎没有从函数中传回。同样,如果我做了与函数不同的事情,它也会起作用。在我找出问题所在后,我编写了我的解决方案的简化版本,而不是有效的版本。但我还是不明白为什么一个有效,一个无效。有人能解释吗 谢谢Javascript 为什么在一个函数中覆盖整个数组并不能替换它,但逐个元素覆盖却能替换它?,javascript,arrays,Javascript,Arrays,我正在学习javascript。其中一个练习是编写一个函数,该函数覆盖作为参数传入的数组中的值。我的解决方案在函数中起作用,但似乎没有从函数中传回。同样,如果我做了与函数不同的事情,它也会起作用。在我找出问题所在后,我编写了我的解决方案的简化版本,而不是有效的版本。但我还是不明白为什么一个有效,一个无效。有人能解释吗 谢谢 function reverseArrayInPlace(ary){ // This version is
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);
结果:
在反向放置位置内:5,4,3,2,1
反向放置后:5,4,3,2,1
位置2内的反向排列:5,4,3,2,1
反转后放置2-为什么顺序错误?:1,2,3,4,5
在外部替换arrayValue2之后:5,4,3,2,1JavaScript是一种传递值(或按值调用,如果您愿意)语言。为函数内部的函数参数指定新值对外部世界没有影响。但是,使用传入的对象引用修改属性值确实会影响外部世界。传入对数组的引用,然后函数可以使用该引用将新值填充到数组的元素中 函数返回修改后的数组,但调用环境忽略了这一点。更改您的测试:
var arrayValue2 = [1, 2, 3, 4, 5];
arrayValue2 = reverseArrayInPlace2(arrayValue2);
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);
JavaScript是一种按值传递(或按值调用,如果您愿意)语言。为函数内部的函数参数指定新值对外部世界没有影响。但是,使用传入的对象引用修改属性值确实会影响外部世界。传入对数组的引用,然后函数可以使用该引用将新值填充到数组的元素中 函数返回修改后的数组,但调用环境忽略了这一点。更改您的测试:
var arrayValue2 = [1, 2, 3, 4, 5];
arrayValue2 = reverseArrayInPlace2(arrayValue2);
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);
你没有保存结果 改为这样做:
var arrayValue = [1, 2, 3, 4, 5];
arrayValue = reverseArrayInPlace(arrayValue);
console.log("After reverseArrayInPlace: " + arrayValue);
var arrayValue2 = [1, 2, 3, 4, 5];
arrayValue2 = reverseArrayInPlace2(arrayValue2);
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);
或
你没有保存结果 改为这样做:
var arrayValue = [1, 2, 3, 4, 5];
arrayValue = reverseArrayInPlace(arrayValue);
console.log("After reverseArrayInPlace: " + arrayValue);
var arrayValue2 = [1, 2, 3, 4, 5];
arrayValue2 = reverseArrayInPlace2(arrayValue2);
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);
或
使用
console.log
记录阵列或任何对象时,请在阵列名称后使用.slice()
制作该阵列的副本。否则,console.log
将获取该数组的引用,并显示该数组的可能较旧版本。控制台不会自动更新修改后的数组。当使用console.log
记录数组或任何对象时,请在数组名称后使用.slice()
创建该数组的副本。否则,console.log
将获取该数组的引用,并显示该数组的可能较旧版本。控制台不会自动更新修改后的阵列。感谢您的回复。但是,这与第一个有什么不同<代码>代码var arrayValue=[1,2,3,4,5];反向放置(arrayValue);log(“反向放置后:+arrayValue”)@第二个是Tarnz,ari=[…]
为变量ari
分配一个全新的数组。该变量是函数的局部变量。调用该函数时,它会在调用上下文中获取对“real”数组的引用的副本。将新值赋给该局部变量根本不会影响arrayValue2
变量。这很有趣。我正在学习的那本书说,如果我有:code
var-ary=。。。与其说是code
ari=…,不如说是“var”关键字会导致这种行为。@在本例中,Tarnzari
是函数声明中的一个参数-在大多数情况下,它的工作原理与使用var
声明的局部变量完全相同。函数参数类似于var
变量,它们被指定一个值作为函数调用的隐式副作用。感谢您的回复。但是,这与第一个有什么不同<代码>代码var arrayValue=[1,2,3,4,5];反向放置(arrayValue);log(“反向放置后:+arrayValue”)@第二个是Tarnz,ari=[…]
为变量ari
分配一个全新的数组。该变量是函数的局部变量。调用该函数时,它会在调用上下文中获取对“real”数组的引用的副本。将新值赋给该局部变量根本不会影响arrayValue2
变量。这很有趣。我正在学习的那本书说,如果我有:code
var-ary=。。。与其说是code
ari=…,不如说是“var”关键字会导致这种行为。@在本例中,Tarnzari
是函数声明中的一个参数-在大多数情况下,它的工作原理与使用var
声明的局部变量完全相同。函数参数类似于var
变量,它们被指定一个值作为函数调用的隐式副作用。感谢您的回复。我明白为什么你的答案会奏效。但是我仍然不清楚为什么我的第一个函数已经可以像以前一样工作了,但是我需要编写对第二个函数的调用,这样它才能工作,因为只有函数的内容不同,而不是调用方式不同。谢谢你的回复。我明白为什么你的答案会奏效。但是我仍然不清楚为什么我的第一个函数已经可以像以前一样工作了,但是我需要编写对第二个函数的调用,这样它才能工作,因为只有函数的内容不同,而不是调用方式不同。谢谢