Javascript到底是如何传递参数的?
有一个小测试。我希望两个Javascript到底是如何传递参数的?,javascript,function,arguments,Javascript,Function,Arguments,有一个小测试。我希望两个obj\d对象的amenmber最终都会更改。然而,change1样式不起作用,我想知道为什么或者为什么不应该这样做 <button id="btn1" onclick="test()">Change</button> <script> var obj1 = { a : {strblahblah: "blah"} }; var obj2 = { a : {strblahblah: "blah"} }; funct
obj\d
对象的a
menmber最终都会更改。然而,change1
样式不起作用,我想知道为什么或者为什么不应该这样做
<button id="btn1" onclick="test()">Change</button>
<script>
var obj1 = { a : {strblahblah: "blah"} };
var obj2 = { a : {strblahblah: "blah"} };
function test(){
change1(obj1.a);
change2(obj2);
alert("obj1: " + obj1.toSource() + "\r\nobj2: " + obj2.toSource());
}
function change1(obj){
obj = {str: "change1"};
}
function change2(obj){
obj.a = {str: "change2"};
}
</script>
这句话
obj={str:“change1”}代码>
导致obj
引用传递的参数以外的内容
其中asobj.a={str:“change2”}代码>
导致传递的参数中的“a”属性更改为其他属性
在第一种情况下,您只是在更改输入的引用,而在另一种情况下,您实际上是在修改输入参数。在change1
中发生的事情是obj
最初在obj1.a
中保存对对象的引用。然而,该行:
obj = {str: "change1"};
obj.a = {str: "change2"};
不更改obj1.a
。相反,它创建一个新对象({str:“change1”}
)并更改obj
,使其现在指向该对象,而不是obj1.a
相比之下,change2
具有obj
初始持有对obj2
中对象的引用,并且具有以下行:
obj = {str: "change1"};
obj.a = {str: "change2"};
它访问被引用对象(即obj2
)的内部结构,从而对该对象进行实际更改。当您将obj1.a
传递到change1()
时,您将发送本身是另一个对象的obj1.a
的值。但是,当您将obj2
发送到change2()
时,它将引用对象,并且当您指定值时,原始值将发生更改,而在第一种情况下,这并没有发生
正如thg437
所建议的,这最好地解释了这种情况
来自:
函数调用的参数是函数的参数。
参数通过值传递给函数。如果功能发生变化
参数的值,此更改不会在全局或
调用函数。但是,对象引用也是值,并且
它们是特殊的:如果函数更改引用对象的
属性,则该更改在函数外部可见
在change1中,您传递的是obj.a
,它实际上是一个值(因为它是一个对象引用,而不是对象本身)。这意味着您将在change1
中收到该引用的副本,然后将其修改为指向新对象。您所做的只是修改传递到函数中的引用副本,以便它有效地指向内存中的其他内容
在change2
中,您正在传递obj
,它也是一个对象引用,但随后您正在修改该引用的a
属性,因此您将获得引用指向的对象并修改其a
属性。修改的对象与您在函数中通过值接收的对象引用副本和代码顶部的引用obj1
指向的对象相同。change1中忘记obj.a
。@simonzack OP将a
作为参数传递给change1
。它认为这是问题的基础(javascript通过引用或值传递)。嗯,引用,现在我可以更好地理解它了,但是,有什么方法可以做像change1
这样的事情吗?因为我想修改obj\d
的a
,但我不想将obj\d
本身暴露在change
方法中,我想你可能想要这样的东西: