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 — this recently (March 2015) blew up on Reddit again over a blog post similar to mine mentioned below, though in this case about Java. It occurred to me while reading the back-and-forth in the Reddit comments that a big part of the confusion stems from the unfortunate collision involving the word "reference". The terminology "pass by reference" and "pass by value" predates the concept of having "objects" to work with in programming languages. It's really not about objects at all; it's about function parameters, and specifically how function parameters are "connected" (or not) to the calling environment. In particular, note that in a true pass-by-reference language — one that does involve objects — one would still have the ability to modify object contents, and it would look pretty much exactly like it does in JavaScript. However, one would also be able to modify the object reference in the calling environment, and that's the key thing that you can't do in JavaScript. A pass-by-reference language would pass not the reference itself, but a reference to the reference.
编辑-这里有一篇关于这个主题的博客文章。(注意那篇文章的注释,解释了c++并没有真正的引用传递。这是真的。然而,c++所拥有的是创建对普通变量的引用的能力,可以在函数调用时显式地创建指针,也可以在调用其参数类型签名要求这样做的函数时隐式地创建指针。这些都是JavaScript不支持的关键。)