[問題] 請問pass by reference

看板Ajax作者 (todo se andarà)時間8年前 (2016/05/17 20:01), 8年前編輯推噓2(2022)
留言24則, 3人參與, 最新討論串1/1
請問一下 雖然不知道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://www.ptt.cc/bbs/Ajax/M.1463486497.A.CB5.html

05/17 20:04, , 1F
一律都是傳值(閉包例外),只是你可以傳上面有屬性的物件
05/17 20:04, 1F

05/17 20:05, , 2F
a.x = n 這句的意思是 修改 a 變數所持有的物件上的 x
05/17 20:05, 2F

05/17 20:06, , 3F
屬性,但你在 a = {} 的同時,就已經把整個物件替換掉了
05/17 20:06, 3F

05/17 20:06, , 4F
所以在這時候,a 跟 b早就是不同東西了
05/17 20:06, 4F

05/17 20:07, , 5F
這時你在去修改 a ,當然不會反映在 b 上
05/17 20:07, 5F
嗯嗯我知道閉包是傳reference 但是大大的意思是 b=a 這樣也會是傳值? 傳值不就是複製一份自己的了嗎? 那更改a.x = n 為什麼也會連帶更改到b.x ?

05/17 20:33, , 6F
在 JavaScript 中 [] 和 {} 會製造一個新物件
05/17 20:33, 6F

05/17 20:37, , 7F
所以 a = [5] 是製造一個新 array 後讓 a 指向它
05/17 20:37, 7F
喔喔所以意思是 一開始 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

05/17 20:49, , 8F
eight0正解
05/17 20:49, 8F

05/17 20:49, , 9F
你a=[1,2,3]的時候,這時候會有一個物件的內容是[1,2,3],
05/17 20:49, 9F

05/17 20:50, , 10F
然後你會把這個對物件的參照指派給a,所以你呼叫a會拿到這
05/17 20:50, 10F

05/17 20:50, , 11F
個物件
05/17 20:50, 11F

05/17 20:51, , 12F
這時候你a[1]=1,是把數字1指派給a參照的物件的索引1,所以
05/17 20:51, 12F

05/17 20:51, , 13F
這時候a儲存的參照還是對著原本的那個陣列
05/17 20:51, 13F

05/17 20:51, , 14F
但如果你再做a=[5],就是你新建立一個[5]的物件,把他的參
05/17 20:51, 14F

05/17 20:52, , 15F
照指派給a,所以這時候a已經遺失了對[1,2,3]的參照,a現在
05/17 20:52, 15F

05/17 20:52, , 16F
參照的物件是[5]
05/17 20:52, 16F

05/17 20:54, , 17F
你把物件指派給變數,實際上那個變數儲存的是對物件的參照
05/17 20:54, 17F

05/17 20:54, , 18F
所以:
05/17 20:54, 18F

05/17 20:55, , 19F
a=[1,2,3] // a現在有對一個新的[1,2,3]物件的參照
05/17 20:55, 19F

05/17 20:55, , 20F
b=a // 你把a的參照指派給b,所以a和b都是參照第1行的物件
05/17 20:55, 20F

05/17 20:55, , 21F
a=[5] // 現在a保存的參照變成是對一個新的[5]物件
05/17 20:55, 21F

05/17 20:56, , 22F
//可是同時b對第1行給的[1,2,3]的參照還在
05/17 20:56, 22F

05/17 20:57, , 23F
其實重點就只是變數保存的是對物件的參照,這樣而已,所以
05/17 20:57, 23F

05/17 20:57, , 24F
你在變數間互相指派,傳一定是傳這個參照
05/17 20:57, 24F
感謝各位 一直以為b=a傳reference是 b「指向」a 再指向內容 結果根本不是.... 是傳參照 現在才搞懂 錯了好久啊Orzzzzzz ※ 編輯: aa06697 (140.116.1.136), 05/17/2016 21:11:23
文章代碼(AID): #1NEmWXor (Ajax)