求質策略
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);
```