Call by Reference & Call by Sharing


Posted by hoyi-23 on 2021-08-12

求質策略

JavaScript是一個動態型別的語言,它的型別會在執行過程中不斷地轉換,代表當在執行階段才會被賦予型別。這個被動態賦予的型別又分為兩大類
原始型別與物件型別
當變數的值是 原生型別(primitive),行為是傳值。
當變數的值是 物件(object),行為是傳參考。

傳質(Call by Value)

用拷貝的方式,所以修改不會互相影響。

var x = 5;
var y = x;
console.log(x,y) // 5,5

x=10;
console.log(x,y) // 10 ,5

傳參照呼叫(Call by Reference)

-和傳值不同的是,傳參照不是拷貝是 "傳參數位置",修改會互相影響

var person 1 = {num:111};
var person2 = person 1;
console.log(person 1, person 2) // {num:111},{num:111}

person 1.num = 222;
console.log(person 1, person 2) // {num:222},{num:222}

傳共用物件呼叫(Call by Sharing)

像是前兩種的融合。雖然是物件型別,但對其一物件變數做重新賦值時,不會互相影響。

  • 不是拷貝'不是傳參數,不會互相影響
    ```
    var person 1 = {num:111};
    var person2 = person 1;
    console.log(person 1, person 2) // {num:111},{num:111}

var person 3 = {num:333};
perons 1 = person 3;

console.log(person 1, person 2,person 3)//{num:333},{num:111},{num:333}

這裡跟 Call by Reference 不同的地方是 **重新賦值**。

-----

例題:

function changeAge(person) {
person.age = 25;
return person
}
var personObj1 = {
name: 'Charles',
age: 30
};
var personObj2 = changeAge(personObj1);
console.log(personObj1); // { name: 'Charles', age: 25 }
console.log(personObj2); // { name: 'Charles', age: 25 }


function changeAge(person) {
person.age = 25;
person = {
name: 'John',
age: 50
}
return person
}
var personObj1 = {
name: 'Charles',
age: 30
};
var personObj2 = changeAge(personObj1);
console.log(personObj1);
console.log(personObj2);
```


#傳值 #傳參考







Related Posts

DAY 01 : 資料結構緒論

DAY 01 : 資料結構緒論

[ Nuxt.js 2.x 系列文章 ] Nuxt.js 套件應用-CKEditor 5

[ Nuxt.js 2.x 系列文章 ] Nuxt.js 套件應用-CKEditor 5

深入激活函數

深入激活函數


Comments