變數包含了兩種不同類型的值: 基本類型 (Undefined、null、Boolean、Number、string都屬於基本類型) 引用類型 (對象) 兩種值在賦值上不同的是: 將一個引用類型的值(對象)賦值給一個變數,可以為其添加/刪除屬性和方法。 但如果是一個基本類型的值是不可以這樣的。 將一個 ...
變數包含了兩種不同類型的值:
- 基本類型 (Undefined、null、Boolean、Number、string都屬於基本類型)
- 引用類型 (對象)
兩種值在賦值上不同的是:
- 將一個引用類型的值(對象)賦值給一個變數,可以為其添加/刪除屬性和方法。
但如果是一個基本類型的值是不可以這樣的。
var person = new Object();
person.name = "Cat.y";
console.log('person.name = ' + person.name);
- 將一個基本類型的值賦給一個變數,那麼是在這個變數上創建一個新值,改變新的變數裡面的值,原本變數中的值不受影響
var num1 = 5;
var num2 = num1;
console.log('num1 = ' + num1 + '\n' + 'num2 = ' + num2); //這裡應該輸出: num1 = 5 num2 = 5
num2 = 10;
console.log('改變num2的值後:\n')
console.log('num1 = ' + num1 + '\n' + 'num2 = ' + num2); //這裡應該輸出: num1 = 5 num2 = 10
console.log('\n\n');
- 將一個對象賦值給一個變數,它賦的值實際上是這個記憶體空間的指向地址。
可以理解為,創建了一個對象,就相當於開了一個房,你往這個對象里添加/刪除方法、屬性、值,就相當於在這個房間內放置/取出東西,
而變數賦的值實際上就是這個房間的門牌號。
因此,兩個變數操作的都是同一個記憶體里的東西,所以,obj1改變了,obj2也會相應的變化
var obj1 = new Object();
var obj2 = obj1;
obj2.name = 'Cat.y';
console.log('obj1.name = ' + obj1.name + '\n' + 'obj2.name = ' + obj2.name );
// obj1.name = Cat.y obj2.name = Cat.y
函數中的參數相當於一個局部的變數
function addTen(num){
num += 10;
return num;
}
var count = 10;
var result = addTen(count);
//輸出結果應該為: count = 10 result = 20;
console.log('count = ' + count + '\n' + 'result = ' + result + '\n');
例子中將一個數值賦值給變數count,再新建一個變數result, result 的值是調用了函數addTen並將count做為參數傳了進去而返回的值
也就是說,result的值是經過addTen函數計算而返回的一個新的值;
函數外,count並不會改變,因為它是相當於變數count的值賦值給了局部變數num,num改變的值是不會影響到count的
再例:
function setName(obj){
obj.name = 'Cat.u';
obj = new Object(); //在函數內重新給obj賦值了一個新的對象,指向的地址改變
obj.name = 'Tuanzi.y'; //影響不到函數外的值
}
var person = new Object();
console.log('person.name = ' + person.name + '\n'); //這時候還沒給peron.name賦值
setName(person);
console.log('person.name = ' + person.name + '\n'); //person.name = Cat.u
如果調用一個函數時,將一個對象作為參數傳了進去,這裡要註意的是,它傳遞的是“指向這個記憶體的地址”,是地址而不是值,也就是“門牌號”
如果在函數內重新給obj變數賦值一個新的對象,obj指向的記憶體地址改變,那之後更改對象內的屬性,對函數外是沒影響的