在 JavaScript 中通过引用传递变量

2022-08-29 23:39:55

如何在 JavaScript 中通过引用传递变量?

我有三个变量,我想对它们执行多个操作,因此我想将它们放在for循环中并对每个变量执行操作。

伪代码:

myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
    // Do stuff to the array
    makePretty(myArray[x]);
}
// Now do stuff to the updated variables

最好的方法是什么?


答案 1

JavaScript 中没有可用的“通过引用传递”。您可以传递一个对象(也就是说,您可以按值传递对对象的引用),然后让函数修改对象内容:

function alterObject(obj) {
  obj.foo = "goodbye";
}

var myObj = { foo: "hello world" };

alterObject(myObj);

alert(myObj.foo); // "goodbye" instead of "hello world"

如果需要,可以循环访问具有数字索引的数组的属性,并修改数组的每个单元格。

var arr = [1, 2, 3];

for (var i = 0; i < arr.length; i++) { 
    arr[i] = arr[i] + 1; 
}

重要的是要注意,“通过引用传递”是一个非常具体的术语。这并不意味着可以传递对可修改对象的引用。相反,这意味着可以以允许函数在调用上下文中修改该值的方式传递简单变量。所以:

 function swap(a, b) {
   var tmp = a;
   a = b;
   b = tmp; //assign tmp to b
 }

 var x = 1, y = 2;
 swap(x, y);

 alert("x is " + x + ", y is " + y); // "x is 1, y is 2"

在像C++这样的语言中,可以做到这一点,因为该语言确实(某种程度上)具有传递引用。

编辑 - 最近(2015年3月)在Reddit上再次爆炸,因为下面提到的一篇与我类似的博客文章,尽管在这种情况下是关于Java的。在阅读Reddit评论中的来回评论时,我突然想到,很大一部分混乱源于涉及“参考”一词的不幸碰撞。术语“通过引用传递”和“按值传递”早于在编程语言中使用“对象”的概念。这真的不是关于物体的;它是关于函数参数的,特别是函数参数如何“连接”(或不连接)到调用环境。特别要注意的是,在真正的引用传递语言中 - 一种确实涉及对象的语言 - 人们仍然能够修改对象内容,并且它看起来与JavaScript中的非常相似。但是,还可以在调用环境中修改对象引用,这是您在JavaScript中无法完成的关键事情。逐个引用的传递语言不会传递引用本身,而是传递对引用的引用

(请注意该帖子的评论,该帖子解释说C++并没有真正的传递引用。这是事实。但是,C++确实具有创建对普通变量的引用的能力,无论是在函数调用时显式创建指针,还是在调用其参数类型签名要求这样做的函数时隐式创建。这些是JavaScript不支持的关键。


答案 2
  1. 字符串和数字等基元类型变量始终按值传递。
  2. 数组和对象根据以下条件按引用或按值传递:
  • 如果要设置对象或数组的值,则它是按值传递。

     object1 = { prop: "car" };
     array1 = [1,2,3];
    
  • 如果要更改对象或数组的属性值,则它是“通过引用传递”。

     object1.prop = "car";
     array1[0] = 9;
    

法典

function passVar(obj1, obj2, num) {
    obj1.prop = "laptop"; // will CHANGE original
    obj2 = { prop: "computer" }; //will NOT affect original
    num = num + 1; // will NOT affect original
}

var object1 = {
    prop: "car"
};
var object2 = {
    prop: "bike"
};
var number1 = 10;

passVar(object1, object2, number1);
console.log(object1); // output: Object { prop: "laptop" }
console.log(object2); // output: Object { prop: "bike" }
console.log(number1); // ouput: 10