返回信息流小白看了 JavaScript高级程序设计 第三章,有点疑问啊
书上说,ECMAScript所有函数的参数都是按值传递的。其中举了一个例子:
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
作者说如果 person 是按引用传递的,那么 person就会自动被修改为指向其 name 属性值为 Greg 的新对象。 所以不是按引用传递。
那如果对于变量赋值:
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "Nicholas";
obj2 = new Object();
obj2.name = "Greg";
alert(obj1.name);
最后显示也是"Nicholas",而并不是"Greg"。
那作者说“访问变量,是按引用”是什么意思?
这两个例子,不论传递参数还是变量赋值,都是针对的地址值。表现都是一样的。那作者又为什么强调引用呢?反而让人难理解
望大神指点啊
这是一条镜像帖。来源:北邮人论坛 / www-technology / #26791同步于 2014/7/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
JavaScript的一点疑问
OriSoul
2014/7/28镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
专业的说法怎么说我不知道,不过我说说我的理解:
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
这里面,在调用setName的时候,传的obj的值,而不是引用。
我先说明一下我用来帮助理解的这两个概念:
obj的值,就是指向那个object的指针(js的概念里面未必叫指针)。
obj的引用,指的是obj的别名,也就是说,它的引用变成了什么,它也变成了什么。
调用这个函数的时候,有三条语句。
第一条,给obj的name赋值。不管是按什么传递的,obj指向的object就是person指向的object。所以person的name也改变了。
第二条,obj赋新值。如果是按引用传递,这一步的话,obj做什么改变,person也该做什么改变。但是如果是按值传递的话,obj被赋了新的值,也就是说obj不再指向原来的person指向的object了。以后obj再做什么,person都不会再变化。
第三条,就是改obj的name的值。这条执行完后,如果person的name变了,所以是按引用传递,如果没变,说明是按值传递。
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "Nicholas";
obj2 = new Object();
obj2.name = "Greg";
alert(obj1.name);
至于这部分的访问变量,是按引用,应该说的是访问object的时候,是按object的引用来访问的(不是按object的引用的引用来访问的)。
这两个地方都提到了引用。函数里面提到的那个引用,有点类似于别名。而变量的这个引用,类似于指针。
不知道理解你的问题没有,也不知道说清楚没有。。。
没get到你问题的point。。。
70页倒数第9行,是第四章,不好意思。其实想问的就是针对引用类型的变量复制和传递参数,是不是都是针对地址值?可能表述不清,这章看得不明白
【 在 liu907030 (bf) 的大作中提到: 】
: “访问变量,是按引用”这句话在第三章哪?没太看懂你最后要问的问题
通过『我邮2.0』发布
function setName(obj) {
obj.name = "Nicholas"; //执行这句的时候person和obj指向同一个地址A,该地址内的数据为Nicholas
obj = new Object(); //分配新的空间,将新的空间的地址B赋值给obj。(person还是指向A)
obj.name = "Greg"; //将B地址内的数据改为Greg
}
最后要求返回的是A地址内的数据,所以是nicholas
【 在 OriSoul 的大作中提到: 】
: 小白看了 JavaScript高级程序设计 第三章,有点疑问啊
: 书上说,ECMAScript所有函数的参数都是按值传递的。其中举了一个例子:
: [code=js]
: ...................
js中,代表引用类型的变量,比如var obj1 = new Object()中的obj1,存放的值是一个指针,指向存储对象的内存处,所以用var obj2 = obj1后,两个变量都保存的是这个指针了,这时你对其中一个做操作,其实是两个变量指向的同一处内存中存放的对象做的操作,反应到变量上就是另一个变量也随之变化了,这就是引用的意思。如果这时你obj2 = new Object(),obj2中存放的就是一个新的指针了,你再对obj2所做的操作就不会反映到obj1上了。
【 在 OriSoul 的大作中提到: 】
70页倒数第9行,是第四章,不好意思。其实想问的就是针...
那作者举了一个例子,来说明是函数参数值传递,而不是引用传递。你看我写的第二段代码,不也能证明变量赋值也不是引用吗
【 在 liu907030 (bf) 的大作中提到: 】
: js中,代表引用类型的变量,比如var obj1 = new Object()中的obj1,存放的值是一个指针,指向存储对象的内存处,所以用var obj2 = obj1后,两个变量都保存的是这个指针了,这时你对其中一个做操作,其实是两个变量指向的同一处内存中存放的对象做的操作,反应到变量上就是另一个变量也随之变化了,这就是引用的意思。如果这时你obj2 = new Object(),obj2中存放的就是一个新的指针了,你再对obj2所做的操作就不会反映到obj1上了。
: 70页倒数第9行,是第四章,不好意思。其实想问的就是针...
通过『我邮2.0』发布
是能体现啊,但是作者想要阐述的是JavaScript函数参数传值的特点,你的例子没涉及函数啊
【 在 OriSoul 的大作中提到: 】
小白看了 JavaScript高级程序设计 第三章,...