Javascript 作为参数传递给函数的jQuery对象是值复制不是引用?

Javascript 作为参数传递给函数的jQuery对象是值复制不是引用?,javascript,jquery,Javascript,Jquery,我的理解是:在Javascript中,对象和数组作为引用传递,而不是函数参数的值。jQuery组是一个对象,因此应该作为引用传递 然而,我在下面的测试脚本中发现一些奇怪的事情正在发生;jQuery组的行为就像一个值,而不是一个引用,除非包装在另一个对象中。。。有人能解释一下吗 <html> <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1

我的理解是:在Javascript中,对象和数组作为引用传递,而不是函数参数的值。jQuery组是一个对象,因此应该作为引用传递

然而,我在下面的测试脚本中发现一些奇怪的事情正在发生;jQuery组的行为就像一个值,而不是一个引用,除非包装在另一个对象中。。。有人能解释一下吗

<html>
<head>
 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>
<body>
<script>

 function test(arg){
   arg = arg.add($('<span/>'))
   console.log(arg);
 };

 ele = $('<div/>');
 test(ele);  // div + span in the group as expected
 console.log(ele); // only the div - the 'arg' param in function was a copy

 function test2(arg){
   arg.a = arg.a.add($('<span/>'));
   console.log(arg.a);
 };

 obj = {a:ele};
 test2(obj); // div + span in the group as expected
 console.log(obj.a); // both in the group - arg acted like a reference!

</script>
</body>
</html>

功能测试(arg){
arg=arg.add($('')
控制台日志(arg);
};
ele=$('');
测试(ele);//组中的div+span如预期
console.log(ele);//只有div(函数中的“arg”参数)是一个副本
函数test2(arg){
arg.a=arg.a.add($('');
控制台日志(arg.a);
};
obj={a:ele};
测试2(obj);//组中的div+span如预期
console.log(对象a);//组中的两个-arg都起到了参考作用!
这是
.add()
方法的一个“功能”。它不修改原始jQuery对象,而是返回一个带有附加值的新对象

给出第一个示例,您需要返回
arg
变量并覆盖
ele

 function test(arg){
   arg = arg.add($('<span/>'))
   console.log(arg);
   return arg;  // return the new jQuery object stored in "arg"
 };

 ele = $('<div/>');
 ele = test(ele);  // overwrite the original "ele" with the returned value
 console.log(ele); 
 function test(arg){
   arg = arg.push($('<span/>')[0])
   console.log(arg);  // Because .push() is being used, "arg" will reference 
                      //   the new length of the array.
 };

 ele = $('<div/>');
 test(ele);  
 console.log(ele); // Will reference jQuery object with both elements
编辑:最后一幅插图。由于
.add()
返回一个新对象,您可以更新这两个变量以指向相同的值,如下所示:

ele = arg = arg.add($('<span/>'));
ele=arg=arg.add($('');

现在,这两个变量不是引用原始对象,也不是引用创建的新对象,而是引用内存中的同一对象。

执行的两个测试不相同。第一个变量将变量
arg
设置为值
arg.add(…)
,而第二个变量将
arg
上名为
a
的属性设置为值
arg.a.add(…)
。JavaScript中的“按引用”传递与其他语言中的传递并不完全相同(事实上,有些人不同意这是真正的按引用传递)。传递类型为对象的变量时,引用的是该变量的值,而不是原始变量


设置
arg=arg.add(…)
时,您正在为
arg
变量设置一个新值并覆盖其以前的值。这不会修改传入的变量,因为您没有对它的引用,只有对它的值(对象)的引用。

这是.add()方法的“功能”。-使它听起来像是可以用另一种方法,如果它是这样编码的。事实上,函数中的
arg
变量设置了一个新值,它不会修改OP认为已“通过引用”传入的外部范围中的
ele
变量。@Andy E-实际上这是可能的。我将给出另一个使用OP的原始代码的示例,但使用的是
push()
。它正确地修改了jQuery对象,并且
ele
引用了更改过的对象。@Andy E-好的,也许我误解了“通过引用传递”的正确含义。当你传递一个变量时,你传递的是一个对其值的引用,我相信这与你在其他面向对象语言(比如Java)中看到的情况是一样的。我弄错了吗?无论如何,这两种解决方案都说明了javascript中的正确概念。@patrick:Java是按值传递的,非常像javascript。通过C#、PHP或VB等语言更准确地传达“通过引用传递”,在这些语言中,您可以将变量传递到函数中,函数的任何修改都会通过传入的原始变量反映出来。通过引用传递通常由具有“in”和“out”参数的函数使用,函数结果实际上将设置为out参数,而不是像JS的返回语句一样。谢谢Patrick和Andy,勾选了这个,但您的回答和讨论都很棒。我想到了PHP(以及用于引用的显式“&”语法),但使我困惑的是$.add()返回的内容。