返回信息流```Javascript
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); // "Nicholas"
```
书中写到,值类型和引用类型作为参数传递,都是按值传递的。
关于这一点有点理解不能,person本身是个引用类型,那么怎么把他作为值传递呢?
而且我觉得书里举的这个例子也不充分
假设对象作为参数传递时 是按照引用的:
1.var person = new Object();此时person指向一个Object
2.将person作为参数传递进函数setNmae,此时obj也指向这个Object
3.obj = new Object();这一句 把参数obj的引用指向了一个新的对象new Object(),此时obj.name改变的是这个新对象的name属性,而不是之前的Object
4.alert(person.name); // "Nicholas" 和之前的结果一致
按照传递引用的理解 也完全说的通啊。
或者我觉得我关于按值传递这个概念没有理解对?
求指点
这是一条镜像帖。来源:北邮人论坛 / www-technology / #37799同步于 2016/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
js高程中关于参数传递的解释
matsunatsuri
2016/7/19镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
虽然不懂js,但java里也是这么说的。值传递和引用传递都是传的值,用引用时就是把引用复制了一份,不是指复制引用的内容,所以这个值传递不是说引用指向对象的值传递,而是这个对这个引用变量进行值传递。好绕。。。
值传递好理解,但是引用作为参数时,传递的这个值到底是什么呢,不理解,,,
总不能obj指向person把。。
【 在 chenxiansf 的大作中提到: 】
: 虽然不懂js,但java里也是这么说的。值传递和引用传递都是传的值,用引用时就是把引用复制了一份,不是指复制引用的内容,所以这个值传递不是说引用指向对象的值传递,而是这个对这个引用变量进行值传递。好绕。。。
```javascript
var a = {name:"Tom"}; //这里的a实际上保存的是这个对象在堆内存中的地址
function changeName(obj){
obj.name = "Jim";
}
changeName(a); // 传入参数实际上是拷贝了a的值传递给obj,所以obj也指向了那个对象
alert(a.name); // Jim```
知乎Yuki Cland举的一个例子,这两句注释本身说明的不就是传递引用这件事吗?
楼主你看当重写obj的时候引用是不是改变了呢? 但是person。name却没有改变说明不是按照引用传递 实际重写之后两个变量引用的是两个不同对象 另外知乎的例子你看没有传参的时候obj就是一个未初始化的变量 一旦穿惨就有了引用和a指向同一个对象 但是obj没有重写 这就是和书上例子的区别 即有没有重写
书里所说的值传递和引用传递是这个意思:
function foo (x, y) {
x = 1
y = {c: 3}
}
var a = 0
var b = {c: 2}
foo(a, b)
console.log(a, b.c)
js结果是0 2.
如果都是引用传递(相对于书所里的值传递),结果是1 3.
这更像是语言问题. 如果你把js中传递对象的方法叫做引用传递,那么我假设的“真正的“引用传递就没法命名了.
————
微博 @flowmemo , 现在主要写JavaScript. 关注广泛, 欢迎交流.
此签名通过「北邮人签名档」脚本发送
等下,有点混乱,我仔细看下这个例子
【 在 e97ace 的大作中提到: 】
: 书里所说的值传递和引用传递是这个意思:
: [code=js]
: function foo (x, y) {
: ...................
我理解的传递引用是,对于一个函数foo(a){},当一个引用类型作为参数插入时,函数体内的这个参数,具有和此引用类型一样的引用。比如var b={s:"sss"},b指向这个对象,那么foo(b){}之后,函数体内的a也指向这个对象。。
【 在 e97ace 的大作中提到: 】
: 书里所说的值传递和引用传递是这个意思:
: [code=js]
: function foo (x, y) {
: ...................
```javascript
function foo(a, b, c){
a=1
b.a="sssss"
c={a:"sssss"}
}
var x=0,y={},z={};
foo(x,y,z);
console.log(x,y,z);
// 0 Object {a: "sssss"} Object {}
```
例子的区别在一个是赋值,一个是修改属性。还是假设引用类型传参时,传递引用。
假设z传入函数时,将指向{}的引用赋给了c,但是c={a:"sssss"}这一句并没有顺着这个引用访问对象{}
而是把一个新的,指向新对象{a:"sssss"}的引用赋给了c?这样理解的话,也解释的通啊,有什么问题吗?
现在好混乱。。。
【 在 e97ace 的大作中提到: 】
: 书里所说的值传递和引用传递是这个意思:
: [code=js]
: function foo (x, y) {
: ...................
其实吧,如果用指针来类比就很好理解
void func(Date* p);这是一个函数
func(d);这是调用这个函数
那么p就是d的一个副本,但是p和d指向的还是一个东西,如果在func里把p修改了,比如
p = q;
那么p变了但d不会变,这就是值传递
如果把指针说成引用,就是*p和*d都是某个Date对象的引用了,那么修改*p时,*d也会跟着变化
其实就是拔高了一层吧。所以引用传递传的是引用的值,也就是复制了地址一样
【 在 chenxiansf 的大作中提到: 】
: 虽然不懂js,但java里也是这么说的。值传递和引用传递都是传的值,用引用时就是把引用复制了一份,不是指复制引用的内容,所以这个值传递不是说引用指向对象的值传递,而是这个对这个引用变量进行值传递。好绕。。。