问题描述
- javascript值传递和引用传递的问题
-
我看了一篇文章,讲了值传递和引用传递的过程,但是页面最后给出的例子却没有看懂,function setName(obj){ obj.name = "test1"; obj = {}; obj.name = "test2"; } var person = new Object(); setName(person); alert(person.name);
该段代码中方法里进行了 obj={ } ,obj.name = "test2"; 这两步操作,
为什么person.name的值还是test1呢?
就算是引用传递,那这也已经改了指向的地址了啊,为什么还会是test1呢?
求大牛们给解释一下,不胜感激
解决方案
obj = {}; //已经重新定义覆盖了
对于传参即使按引用传递对象,如果直接在函数中用新值覆盖原先的值,那跟传递进去的对象没关系的。只有改变对象属性,对参数的对象才有影响。
如果学过C,你可以这么理解
内存有一个Person,参数就是执行这个person的指针。如果通过指针.属性,那么肯定也改变了person的属性。但如果对指针重新定义了一个地址,那和原来的person一点关系都没有
解决方案二:
- 传递的是地址,这个你没错
- obj = {}
这等于创建一个新的object, 赋给了obj, 只不过内容为空,然后
obj.name = ...
你为它添加了一个key/value 就是name=...
此时,内存中有两个object, 一个是原来的person, 而另一个就是在setName中创建的obj, 以我理解,实质上是就两条指针,一条名叫person, 一条叫obj, 你把person的值复制给了obj,然后又创建了一个新的空白object并把它地址给了obj, 所以,现在两条指针指向各自不同的空间。
- setName返回,原来的person仍有效, 所以它的name值没错。
- 你试一下不用 obj = {}
解决方案三:
是值引用了。。但是你obj={}指向了另外一个新的对象,释放了对原来person对象的句柄,所以下面的test2更新的已经不是obj对象了,而是{}这个新的对象
解决方案四:
javascript中,变量有值访问和引用访问,但参数传递都是值传递(按照professional javascript上的叙述,我比较赞成这种理解)。这在引用类型的变量的传递上特别容易引起困惑。
注意,代码中的形参obj和全局变量person开始都指向同一个对象,但obj={}的执行效果,只是改变了obj变量的指向,而外部的person变量还是指向原来的对象。
解决方案五:
解释有很多,但是原理只有一个。javascript是一门很深的语言。学习起来真的狠不容易。