作者aa06697 (todo se andarà)
看板Ajax
标题[问题] 请问pass by reference
时间Tue May 17 20:01:33 2016
请问一下
虽然不知道assign值能不能说是pass by reference
以下是我用firebug测试的code
http://imgur.com/6v6bfIY
一开始的疑问是array(object)应该是pass by reference
所以b是指向a
在我a = [5]; 之後b应该也要变成[5] 但印出来却仍然是原本的
同理下面的object也是
然後我找到这个
http://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference
所以是一般会是pass by reference 但是直接改变他的reference时又会变成pass by value?
请问这要怎麽解释会比较好呀? 感觉关键是那句「copy of a reference」
但是我不懂这句话的精髓是想要表达什麽
PS. 其实一开始是在写function互传才发现这件事
一直以为function是object所以应该就是pass by reference
function A() {...}
function B() {...}
var C = B;
之後又B = A;
然後在执行C却仍然是B而没有变A 才发现我观念根本错了lolllll
求救各位大神Orz
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.1.136
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1463486497.A.CB5.html
1F:→ mmis1000: 一律都是传值(闭包例外),只是你可以传上面有属性的物件 05/17 20:04
2F:→ mmis1000: a.x = n 这句的意思是 修改 a 变数所持有的物件上的 x 05/17 20:05
3F:→ mmis1000: 属性,但你在 a = {} 的同时,就已经把整个物件替换掉了 05/17 20:06
4F:→ mmis1000: 所以在这时候,a 跟 b早就是不同东西了 05/17 20:06
5F:→ mmis1000: 这时你在去修改 a ,当然不会反映在 b 上 05/17 20:07
嗯嗯我知道闭包是传reference 但是大大的意思是 b=a 这样也会是传值?
传值不就是复制一份自己的了吗? 那更改a.x = n 为什麽也会连带更改到b.x ?
6F:推 eight0: 在 JavaScript 中 [] 和 {} 会制造一个新物件 05/17 20:33
7F:→ eight0: 所以 a = [5] 是制造一个新 array 後让 a 指向它 05/17 20:37
喔喔所以意思是 一开始 a = [1,2,3] a存的是指向[1,2,3]的位址
然後b = a 是传值 但是是传a指向的位址(这应该就是我上面题的那个copy of reference所要表达的?)
所以後来 a = [5] a会变成指向[5]的位址
而b仍然是存着指向[1,2,3]的位址?
是这个意思吗? 突然有种豁然开朗的感觉m~_~m
※ 编辑: aa06697 (140.116.1.136), 05/17/2016 20:48:56
8F:推 Hevak: eight0正解 05/17 20:49
9F:→ Hevak: 你a=[1,2,3]的时候,这时候会有一个物件的内容是[1,2,3], 05/17 20:49
10F:→ Hevak: 然後你会把这个对物件的参照指派给a,所以你呼叫a会拿到这 05/17 20:50
11F:→ Hevak: 个物件 05/17 20:50
12F:→ Hevak: 这时候你a[1]=1,是把数字1指派给a参照的物件的索引1,所以 05/17 20:51
13F:→ Hevak: 这时候a储存的参照还是对着原本的那个阵列 05/17 20:51
14F:→ Hevak: 但如果你再做a=[5],就是你新建立一个[5]的物件,把他的参 05/17 20:51
15F:→ Hevak: 照指派给a,所以这时候a已经遗失了对[1,2,3]的参照,a现在 05/17 20:52
16F:→ Hevak: 参照的物件是[5] 05/17 20:52
17F:→ Hevak: 你把物件指派给变数,实际上那个变数储存的是对物件的参照 05/17 20:54
18F:→ Hevak: 所以: 05/17 20:54
19F:→ Hevak: a=[1,2,3] // a现在有对一个新的[1,2,3]物件的参照 05/17 20:55
20F:→ Hevak: b=a // 你把a的参照指派给b,所以a和b都是参照第1行的物件 05/17 20:55
21F:→ Hevak: a=[5] // 现在a保存的参照变成是对一个新的[5]物件 05/17 20:55
22F:→ Hevak: //可是同时b对第1行给的[1,2,3]的参照还在 05/17 20:56
23F:→ Hevak: 其实重点就只是变数保存的是对物件的参照,这样而已,所以 05/17 20:57
24F:→ Hevak: 你在变数间互相指派,传一定是传这个参照 05/17 20:57
感谢各位 一直以为b=a传reference是 b「指向」a 再指向内容
结果根本不是.... 是传参照 现在才搞懂 错了好久啊Orzzzzzz
※ 编辑: aa06697 (140.116.1.136), 05/17/2016 21:11:23