深入探討 JavaScript 中的參數傳遞:call by value 還是 reference?
參數傳遞
程式語言在傳遞參數的時候,一般分成兩種:
- Call By Value
- Call By Reference
Call By Value
傳遞的時候,把參數的值傳過去,也就是直接拷貝一份一模一樣的,但跟原本的參數完全無關
function swap(a, b) {
var temp = a
a = b
b = temp
}
var x = 5
var y = 10
swap(x, y)
console.log(x, y) // 5, 10
Call By Reference
傳遞的時候,傳的是參數的參考,改變 function 裡面的參數,外面的也會被影響
function add(obj) {
obj.age++
}
var p1 = {age: 20}
add(p1)
console.log(p1.age) // 21
但其實 JavaScript 並沒有 Call By Reference,那怎麼解釋上面這個情況呢?
Call By Sharing
傳遞的時候,function 裡外的參數都是指向同一個物件,但若將 function 的參數重新賦值,外面的參數則不會被影響
function add(obj) {
obj = {age: obj.age + 1}
}
var p1 = {age: 20}
add(p1)
console.log(p1.age) // 20
總結
JavaScript 只有 Call By Value,或者可以說 JavaScript 的 Primitive type 是 Call By Value,物件則是 Call By Sharing
參考資料
深入探討 JavaScript 中的參數傳遞:call by value 還是 reference?