Javascript 作为参数传递给函数的jQuery对象是值复制不是引用?
我的理解是:在Javascript中,对象和数组作为引用传递,而不是函数参数的值。jQuery组是一个对象,因此应该作为引用传递 然而,我在下面的测试脚本中发现一些奇怪的事情正在发生;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
<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()返回的内容。