1. 程式人生 > 其它 >JavaScript基本型別與引用型別

JavaScript基本型別與引用型別

前面已經說過,JavaScript變數是鬆散型別,它可以儲存任何型別的值。變數的值以及資料型別可以在指令碼的生命週期內發生改變。變數包含兩種不同型別的值:基本型別和引用型別。基本型別值的是簡單的資料段,而引用型別指的是可能由多個值構成的物件。

基本型別包括:undefined,null,boolean,number,string。這5中型別是按值訪問的,可以操作儲存在變數中的實際值。引用型別的值是儲存在記憶體中的物件。JavaScript不允許直接訪問記憶體中的物件,不能直接操作物件的記憶體空間。在操作物件時,實際操作的是物件的引用,而不是實際的物件。引用型別的值是按引用訪問的。

對於引用型別,定義引用型別後,可以為引用型別的變數新增屬性和方法,也可以刪除屬性和方法。

var obj = new Object();
obj.name="druant";
obj.sex="man";
obj.getName=function(){
return this.name;
}
console.log(obj.name);//druant
obj.name="jordan";
console.log(obj.getName());//jordan
delete obj.name;
console.log(obj.name);//undefined

上面的程式碼中,首先定義了一個物件obj,為obj添加了屬性name,sex並賦值。添加了方法getName,可以獲取到物件的name。第一個console輸出druant,obj.name="jordan",改變了obj屬性name的值,第二個console輸出 jordan。delete 用於刪除物件的屬性,所以第三個console輸出undefined。

從一個變數複製一個值給另一個變數時候,基本型別與引用型別是完全不同的。

var num=5;
var num1=num;

上面的程式碼定義了變數num,並初始化值為5.第二句話將num的值賦給了num1,這樣num1的值也為5,但是num1其實是建立了一個新的值,與num完全沒有關係。當num的值發生改變的時候,num1不會發生改變。

複製前

Num

5

複製後

Num1

5

Num

5

同樣,引用型別的值也可以賦值給另一個物件。結束後,兩個物件其實是指向了同一個堆中的物件。一個物件的改變會影響另一個物件的值。

var obj = new  Object();
var obj1 = obj;
obj1.name="druant";
console.log(obj.name);//輸出name

上面的程式碼定義了一個物件obj,並obj賦值給obj1,此時obj與obj1指向的是同一個引用,當為obj1新增屬性的時候,obj同樣擁有了相同的屬性。

對於函式的引數是按值傳遞的,但是基本型別的傳引數和它的複製過程是一直的,同樣引用型別的傳值,同引用也是一致的。

var num=10;
function numTest(n){
    n+=n;
    return n;
}
var result=numTest(num);
console.log(num);//輸出10;
function testObj(str){
str.name="hello";
}
var obj = new Object();
obj.name="world";
testObj(obj);
console.log(obj.name);//輸出hello

上述程式碼體現了基本型別和引用型別在函式引數使用過程中的不同。numTest內部的方法並沒有改變num的值,而objTest確改變了外部obj的屬性。

 檢測一個數據是否是基本型別用typeof來檢測,檢測資料的引用型別用instanceof來檢測。

var person={};
var colors=["red","blue"];
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof 23);//number
console.log(typeof true);//boolean
console.log(typeof "123");//string
console.log(person instanceof Object);//true
console.log(colors instanceof Array);//true