使用数组 [duplicate] 通过引用传递

pass by reference with array [duplicate]

提问人: 提问时间:6/21/2022 最后编辑:Mister Jojo 更新时间:6/21/2022 访问量:49

问:

如果我改变 within 的值,则更新新的:myArraymyFunctionmyArray

let myArray = [1, 2, 3];
console.log( JSON.stringify(myArray) ); // [1, 2, 3]

function myFunction(arr) {
  arr.push(4);
  console.log( JSON.stringify(arr) ); // [1, 2, 3, 4]
  return arr;
}

myFunction(myArray);
console.log( JSON.stringify(myArray) ); // [1, 2, 3, 4]
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}

但是,如果我尝试重新分配 within ,则保持不变。myArrayarr = [0];myFunctionmyArray

let myArray = [1, 2, 3];
console.log( JSON.stringify(myArray) );; // [1, 2, 3]

function myFunction(arr) {
  arr = [0];
  console.log( JSON.stringify(arr) ); // [0]
  return arr;
}

myFunction(myArray);
console.log( JSON.stringify(myArray) ); // [1, 2, 3]
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}

为什么在上面的示例中不能重新分配,但如果我这样做可以:myArray

let myArray = [1, 2, 3];
myArray = [0];
console.log(myArray); // [0]
JavaScript 数组 按引用传递

评论

0赞 sp00m 6/21/2022
引用 Wiki 的“通过共享调用”部分:调用方将看到被调用例程执行的参数的突变,[但] 无法在被调用方的作用域中模拟对该变量的赋值
2赞 t.niese 6/21/2022
JavaScript没有“通过引用传递”,所以参数是与变量不同的变量,所以赋值不会影响。 保存对数组的引用/指针/链接,并且该引用/指针/链接按值传递,因此和指向同一对象。arrmyArrayarrmyArrayarrarrmyArray

答:

-1赞 Scott 6/21/2022 #1

在您的示例中,您实际上并没有重新分配 .你需要做.myArraymyArray = myFunction(myArray)

评论

0赞 t.niese 6/21/2022
OP 假设它是通过引用传递的(但事实并非如此),如果是这样的话,那么它只是对 的引用,所以分配给 也会改变。这是一个经常发生的误解。myArrayarrmyArrayarrmyArray
0赞 Mister Jojo 6/21/2022 #2

您将链接到数组内部元素的寻址与数组本身的寻址混淆了

let myArray = [1, 2, 3];  

在内存中创建一个数组对象,并在
变量上给出他的地址
[1, 2, 3]myArray

function myFunction(arr)

创建一个新变量,该变量以变量地址的副本命名
arrmyArray



以同样的方式,你有:

let myArray = [1, 2, 3]
let arr     = myArray

arr = [0]
 
console.log( JSON.stringify(myArray) ) // [1, 2, 3]
console.log( JSON.stringify(arr) )     // [0] 
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}