# by reference (傳參考)、by value(傳值) ###### tags: `六角學院` `Javascript` ## Javascript的兩種型別 JavaScript 的資料可以分成「基本型別」(Primitives) 與「物件型別」(Object) 兩大類。 ### 基本型別 簡單來說就是純值,包括有可能有number、boolean、srtring等等的型別,通常都是使用 call by value 來做呼叫。 在基本型別中要判斷兩個變數是否相等,需要去比較兩者內的"值"是否相等。 ```jsx let a = 10; let b = 10; console.log( a === b ); // true > ``` ### 物件型別 物件型別指的是可能由零或多種不同型別 (包括純值與物件) 所組合成的物件,通常都是使用 call by **reference** 來做呼叫。 就算不同的物件裡宣告相同的變數,他們可以稱為等值,但他們仍然屬於不同的"實體(instance)"。 ## 傳值呼叫 call **by value** 對於基本型別來說,當我們將某b變數賦予給a時,會取出物件b的值塞給a變數,但並不代表b的值會改變,因為他們是用裡面的值去做辨別的,這個就是「**傳值**」 (pass by value)。,以下例子 : ```jsx var a = 10; var b = a; a = 100; console.log( a ); // 100 console.log( b ); // 10 //當a更新後並不會影響b的值 ``` > 簡單來說,表面上b的值是複製a變數得來的,但實際上b是自己開了一個新的空間並將裡面的值設為10,與a仍然是互相獨立不受影響的變數。 ## 傳址呼叫 直接來看範例 : ```jsx var a = { value: 10 }; var b = a; console.log( a.value ); // 10 console.log( b.value ); // 10 a.value = 100; console.log( a.value ); // 100 console.log( b.value ); // 100 ``` 我們可以看出來,此時的a與b是指向同一塊記憶體,也就是同一個實體的,所以當a被指向為b的時候,兩個變數都指向同一塊記憶體,當其中一個被改變時,另一個理所當然地也會一起被修改。像這種透過引用的方式來傳遞資料,接收的其實是引用的「參考」而不是值的副本時,我們通常會稱作「**傳址**」 (pass by reference)。 ## 參考資料 [https://ithelp.ithome.com.tw/articles/10191057](https://ithelp.ithome.com.tw/articles/10191057)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up