作者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/m.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