詳解JS中的基本資料型別和引用資料型別
阿新 • • 發佈:2018-12-23
- ECMAScript變數可能包含兩種不同型別的值:基本型別值和引用型別值。基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。
- 在將一個值賦值給變數時,解析器必須確定這個值是基本型別值還是引用型別值
- js的六大資料型別:Number, String, Boolean, Undefined , Null , Object
- 基本資料型別:Number,String,Boolean, Null
引用資料型別:Object , Array, Function
其中的5種基本資料型別是按值訪問的,因為可以操作儲存在變數中的實際的值;而引用型別是的值是儲存在記憶體中的物件。與其它語言不同,JavaScript不允許直接訪問記憶體中的位置,也就是說不能直接操作物件的記憶體空間。在操作物件時,實際上是在操作物件的引用,因此引用型別的值是按引用訪問的
如何區別兩者
1.對於存放兩種資料型別的變數 :存放 js基本資料型別的變數存放的是基本型別資料的實際值,而存放引用資料型別的變數是儲存對它的引用即指標
2 變數的交換(複製變數時): 對於存放基本資料型別的變數的交換,等於在一個新的作用域建立一個新的空間,新空間與原有的空間不會相互影響
對於存放引用資料型別的變數的交換,並不會建立一個新的空間,而是讓物件或方法和之前物件或方法同時指向一個原有空間(即一個地址)
3 宣告變數時不同的記憶體分配: 基本資料型別值(原始值)是儲存在棧(stack)中的資料段,即直接儲存在變數訪問的位置
引用資料型別值是儲存在堆(heap)中的物件即儲存在變數處的值是一個指標,指向儲存物件的記憶體地址。
4 引數傳遞的不同 : 首先要明確ECMAScript中所有的函式的引數都是按值來傳遞的
變數儲存的基本型別的值只是把值傳遞給引數之後引數和這個變數互不影響
變數儲存的引用資料型別值儲存的是該引用值在堆記憶體中的記憶體地址,因此傳遞的值就是這個記憶體地址。
舉例說明兩者區別
var a = 8;
var b = a ;//此處a和b有著相同的值,但是兩者是相互獨立的互不影響
a = 10;//給a賦了新值,但是不影響b
console.log(b);//輸出8
var c = [1,2,3];//此處是將一個記憶體地址儲存給了變數c var d = c ;//此處c和d指向的是同一個記憶體地址 c[0] = 2;//此處將地址的值改變則會影響到d console.log(d);//[2,2,3]
var e = [4,5,6];
var f = [7,8,9];//在此處f和e指向了不同的記憶體地址,則兩者將不會有任何相互影響
e[0] = 5;
console.log(f);//[7,8,9]
總結:
基本型別值與引用型別值具有以下特點
- 基本型別值在記憶體中佔據固定大小的空間,因此被儲存在棧記憶體中
- 從一個變數向另一個變數複製基本型別的值,會建立這個值的一個副本
- 引用型別的值是物件,儲存在堆記憶體中
- 包含引用型別值的變數實際上包含的並不是物件本身,而是一個指向該物件的指標
- 從一個變數向另一個變數複製引用型別的值,複製的其實是指標,因此最終兩個變數最終都指向同一個物件
- 確定一個值是哪種基本型別可以使用typeof操作符,而確定一個值是哪種引用型別可以使用instanceof操作符
JS面試:https://jingyan.baidu.com/article/597a064326352b312b5243d0.html