javascript - 在 JavaScript 中通过引用传递变量

标签 javascript variables pass-by-reference

如何在 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

最好的方法是什么?

最佳答案

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++ 这样的语言中,这样做是可能的,因为该语言确实(某种意义上)具有传递引用。

edit — 最近(2015 年 3 月)在 Reddit 上再次引爆了一篇与我下面提到的类似的博客文章,尽管在本例中是关于 Java。在阅读 Reddit 评论中的来回评论时,我突然想到,很大一部分困惑源于涉及“引用”一词的不幸碰撞。术语“按引用传递”和“按值传递”早于在编程语言中使用“对象”的概念。这根本不是关于对象的。它是关于函数参数的,特别是函数参数如何“连接”(或不连接)到调用环境。特别要注意的是,在真正的按引用传递语言中——确实涉及对象的语言——仍然可以修改对象内容,并且看起来几乎和 JavaScript 中的一样。但是,可以在调用环境中修改对象引用,这是你在 JavaScript 中不能做的关键事情。传递引用的语言不会传递引用本身,而是对引用的引用

编辑here is a blog post on the topic. (请注意该帖子的评论,该评论解释了 C++ 并没有真正的传递引用。这是真的。但是,C++ 确实具有创建对普通变量的引用的能力,或者在函数点显式地创建引用调用来创建指针,或者隐式在调用参数类型签名要求完成的函数时。这些是 JavaScript 不支持的关键。)

关于javascript - 在 JavaScript 中通过引用传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7744611/

相关文章:

Javascript端口访问

javascript - 删除数组分隔符

variables - Jekyll - 将 jekyll 变量传递给自定义液体标签

javascript - 同时获取2个ajax数据

javascript - 如何将事件处理程序绑定(bind)到 Google Maps V3 API 默认 PanControl 的点击事件?

java - Java如何识别一个位置是否持有原始或引用

function - 如何将另一个函数返回的函数分配给函数变量?结果而不是生成函数本身

PHPUnit 和调用时传递引用

C# Dll 库不向 Delphi 应用程序返回输出参数值

arrays - 在 Perl 中通过哈希内部的引用数组传递