BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #37799同步于 2016/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

js高程中关于参数传递的解释

matsunatsuri
2016/7/19镜像同步19 回复
```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" 和之前的结果一致 按照传递引用的理解 也完全说的通啊。 或者我觉得我关于按值传递这个概念没有理解对? 求指点
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
chenxiansf机器人#1 · 2016/7/19
虽然不懂js,但java里也是这么说的。值传递和引用传递都是传的值,用引用时就是把引用复制了一份,不是指复制引用的内容,所以这个值传递不是说引用指向对象的值传递,而是这个对这个引用变量进行值传递。好绕。。。
matsunatsuri机器人#2 · 2016/7/19
值传递好理解,但是引用作为参数时,传递的这个值到底是什么呢,不理解,,, 总不能obj指向person把。。 【 在 chenxiansf 的大作中提到: 】 : 虽然不懂js,但java里也是这么说的。值传递和引用传递都是传的值,用引用时就是把引用复制了一份,不是指复制引用的内容,所以这个值传递不是说引用指向对象的值传递,而是这个对这个引用变量进行值传递。好绕。。。
matsunatsuri机器人#3 · 2016/7/19
```javascript var a = {name:"Tom"}; //这里的a实际上保存的是这个对象在堆内存中的地址 function changeName(obj){ obj.name = "Jim"; } changeName(a); // 传入参数实际上是拷贝了a的值传递给obj,所以obj也指向了那个对象 alert(a.name); // Jim``` 知乎Yuki Cland举的一个例子,这两句注释本身说明的不就是传递引用这件事吗?
elva2596机器人#4 · 2016/7/19
楼主你看当重写obj的时候引用是不是改变了呢? 但是person。name却没有改变说明不是按照引用传递 实际重写之后两个变量引用的是两个不同对象 另外知乎的例子你看没有传参的时候obj就是一个未初始化的变量 一旦穿惨就有了引用和a指向同一个对象 但是obj没有重写 这就是和书上例子的区别 即有没有重写
e97ace机器人#5 · 2016/7/19
书里所说的值传递和引用传递是这个意思: 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. 关注广泛, 欢迎交流. 此签名通过「北邮人签名档」脚本发送
matsunatsuri机器人#6 · 2016/7/19
等下,有点混乱,我仔细看下这个例子 【 在 e97ace 的大作中提到: 】 : 书里所说的值传递和引用传递是这个意思: : [code=js] : function foo (x, y) { : ...................
matsunatsuri机器人#7 · 2016/7/19
我理解的传递引用是,对于一个函数foo(a){},当一个引用类型作为参数插入时,函数体内的这个参数,具有和此引用类型一样的引用。比如var b={s:"sss"},b指向这个对象,那么foo(b){}之后,函数体内的a也指向这个对象。。 【 在 e97ace 的大作中提到: 】 : 书里所说的值传递和引用传递是这个意思: : [code=js] : function foo (x, y) { : ...................
matsunatsuri机器人#8 · 2016/7/19
```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) { : ...................
chenxiansf机器人#9 · 2016/7/19
其实吧,如果用指针来类比就很好理解 void func(Date* p);这是一个函数 func(d);这是调用这个函数 那么p就是d的一个副本,但是p和d指向的还是一个东西,如果在func里把p修改了,比如 p = q; 那么p变了但d不会变,这就是值传递 如果把指针说成引用,就是*p和*d都是某个Date对象的引用了,那么修改*p时,*d也会跟着变化 其实就是拔高了一层吧。所以引用传递传的是引用的值,也就是复制了地址一样 【 在 chenxiansf 的大作中提到: 】 : 虽然不懂js,但java里也是这么说的。值传递和引用传递都是传的值,用引用时就是把引用复制了一份,不是指复制引用的内容,所以这个值传递不是说引用指向对象的值传递,而是这个对这个引用变量进行值传递。好绕。。。