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 上再次通过一篇类似于下面提到的我的博客文章在 Reddit 上大放异彩,尽管在这种情况下是关于 Java。我在阅读 Reddit 评论中的来回评论时突然想到,很大一部分混乱源于涉及“引用”一词的不幸冲突。术语“通过引用传递”和“通过值传递”早于在编程语言中使用“对象”的概念。它真的完全不是关于对象的。它是关于函数参数,特别是函数参数如何“连接”(或不连接)到调用环境。特别是,,它看起来与 JavaScript 中的非常相似。但是,您也可以在调用环境中修改对象引用,这是您在 JavaScript 中无法做到的关键。传递引用语言不会传递引用本身,而是传递对引用的引用。
编辑-这是关于该主题的博客文章。(注意那篇文章的评论,它解释了 C++ 并没有真正通过引用传递。这是真的。然而,C++ 确实具有创建对普通变量的引用的能力,无论是在函数点显式调用以创建指针,或在调用其参数类型签名要求完成的函数时隐式调用。这些是 JavaScript 不支持的关键。)