基本資料型別存放在棧中
存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配,是直接按值存放的,所以可以直接訪問。
基本資料型別值不可變
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'};
引用型別值可變
引用型別是可以直接改變其值的,例如:
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
複製程式碼
#傳值與傳址
在我們進行賦值操作的時候,基本資料型別的賦值(=)是在記憶體中新開闢一段棧記憶體,
然後再把再將值賦值到新的棧中。例如
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10
複製程式碼
所以說,基本型別的賦值的兩個變數是兩個獨立相互不影響的變數。
但是引用型別的賦值是傳址。只是改變指標的指向,
例如,也就是說引用型別的賦值是物件儲存在棧中的地址的賦值,
這樣的話兩個變數就指向同一個物件,因此兩者之間操作互相有影響。例如:
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
複製程式碼