js資料型別之基本資料型別和引用資料型別

火雲邪神發表於2018-06-19

js資料型別之基本資料型別和引用資料型別

基本資料型別存放在棧中

存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配,是直接按值存放的,所以可以直接訪問。

基本資料型別值不可變

javascript中的原始值(undefined、null、布林值、數字和字串)與物件(包括陣列和函式)有著根本區別。原始值是不可更改的:任何方法都無法更改(或“突變”)一個原始值。對數字和布林值來說顯然如此 —— 改變數字的值本身就說不通,而對字串來說就不那麼明顯了,因為字串看起來像由字元組成的陣列,我們期望可以通過指定索引來假改字串中的字元。實際上,javascript 是禁止這樣做的。字串中所有的方法看上去返回了一個修改後的字串,實際上返回的是一個新的字串值。

基本資料型別的值是不可變的,動態修改了基本資料型別的值,它的原始值也是不會改變的,例如:

var a = 'oop';
oop[0] = 'p';//p
console.log(a) //oop

基本型別的比較是值的比較
基本型別的比較是值的比較,只要它們的值相等就認為他們是相等的,例如:
    var a = 1;
    var b = 1;
    console.log(a === b);//true比較的時候最好使用嚴格等,因為 == 是會進行型別轉換的,比如:
    var a = 1;
    var b = true;
    console.log(a == b);//true


複製程式碼

引用型別

引用型別存放在堆中

引用型別(object)是存放在堆記憶體中的,變數實際上是一個存放在棧記憶體的指標,這個指標指向堆記憶體中的地址。每個空間大小不一樣,要根據情況開進行特定的分配,例如。

var person1 = {name:'jozo'}; var person2 = {name:'xiaom'}; var person3 = {name:'xiaoq'};

js資料型別之基本資料型別和引用資料型別

引用型別值可變

引用型別是可以直接改變其值的,例如:
    var a = [1,2,3];
    a[1] = 5;
    console.log(a[1]); // 5  引用型別的比較是引用的比較
所以每次我們對 js 中的引用型別進行操作的時候,都是操作其物件的引用(儲存在棧記憶體中的指標)
,所以比較兩個引用型別,是看其的引用是否指向同一個物件。例如:
    var a = [1,2,3];
    var b = [1,2,3];
    console.log(a === b); // false
複製程式碼

js資料型別之基本資料型別和引用資料型別

#傳值與傳址

在我們進行賦值操作的時候,基本資料型別的賦值(=)是在記憶體中新開闢一段棧記憶體,
然後再把再將值賦值到新的棧中。例如
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10
複製程式碼

js資料型別之基本資料型別和引用資料型別
所以說,基本型別的賦值的兩個變數是兩個獨立相互不影響的變數。


但是引用型別的賦值是傳址。只是改變指標的指向,
例如,也就是說引用型別的賦值是物件儲存在棧中的地址的賦值,
這樣的話兩個變數就指向同一個物件,因此兩者之間操作互相有影響。例如:

var a = {}; // a儲存了一個空物件的例項
var b = a;  // a和b都指向了這個空物件

a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'

b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22

console.log(a == b);// true

複製程式碼

js資料型別之基本資料型別和引用資料型別

相關文章