在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不支持的关键点。)
makePretty(var1); makePretty(var2); makePretty(var3); ...
- BFTrickarr = [var1, var2, var3]; for (var i = 0, len = arr.length; i < len; i++) { arr[i] = makePretty(arr[i]); }
-- 您只需要将makePretty
返回的值存储回数组中的槽位即可。 - dylnmc