1. 程式人生 > >javascript例項區分基本資料型別和引用資料型別

javascript例項區分基本資料型別和引用資料型別

說之前先來介紹一下基本資料型別和引用資料型別指的到底是哪些資料型別。

1、五種基本資料型別:Number、String、Boolean、Null、Undefined

2、引用資料型別:Object

例項區分:

<script>
//基本資料型別代表Number
var one = 666;
var two = one;  //此時two=666

one++;          //one++,此時one=667
alert("one="+one); //結果one=667
alert("two="+two); //結果two=666


//引用資料型別代表Object
var obj1 = new Object();
obj1.one = 666;
var obj2 = obj1;

obj1.one++;
alert("obj1.one="+obj1.one);    //結果obj1.one=667
alert("obj2.one="+obj2.one);    //結果obj2.one=667

</script>

為什麼Number的two不會跟著one改變而改變,obj2.one卻會跟著obj1.one的改變而改變呢?

因為,值與值是獨立存在,修改一個變數值不會影響其他的變數值。而物件是儲存在堆記憶體中的,每建立一個新的物件就在堆記憶體中開闢出一個新的空間,變數儲存的是物件的記憶體地址(物件的引用),如果兩個物件儲存的是同一個物件引用,當一個通過一個變數修改屬性是,另一個也會跟著改變。

例子中,物件obj1的one屬性儲存的是記憶體地址(引用),假設該地址是a,a地址裡放了值666。當obj2=obj1時,兩個物件都指向了同一個a地址,當obj1.one++時,a地址裡的變數one也發生了改變,因為obj2.one=a地址裡的one,所以obj2.one的值也發生改變,最後所有one都等於667。

引用資料型別的第二種情況:

<script>

//第二種情況,物件斷開和記憶體的連線
var obj1 = Object();
var obj2 = obj1;
obj2=null;

alert("obj1是"+obj1);  //obj1是Object
alert("obj2是"+obj2);  //obj2是null
</script>

當物件obj2斷開和記憶體的連線時,obj1不會跟著改變。

引用資料型別的第三種情況:

<script>
var obj1 = new Object();
var obj2 = new Object();

alert(obj1==obj2);  //結果返回false
</script>

為什麼不相等呢?

因為比較兩個引用資料型別時,比較的是物件的記憶體地址。即使兩個物件是一模一樣的,但是地址不同(每建立一個新的物件就在堆記憶體中開闢出一個新的空間),結果也是false。