一.基礎型別
A. 基礎型別有5種,Number,String,Boolean,Null,Undefined
B. 基礎型別沒有堆的概念,堆只針對參考型別,
所有基礎型別都是以key-value形式存放在堆疊中,其中,基礎型別的值不可變,除非是重新賦值,
比如:
var a = "1234"; a[0] = "k";//對值本身修改,無效 console.log(a)//1234 a = "k";//重新賦值 console.log(a)//k
二.參考型別
參考型別,如Array,Object,Function,Date,RegExp等
所有參考型別都是以key-value形式存放在堆疊中,其中,參考型別的key-value存放的value是指標地址,地址指向所在的堆的某個空間 ,這個空間存放著參考型別資料的值,
注意:
參考資料的值為 “堆值”,設堆值為value1 ,堆值物件內部的的key-value形式的value值為值中值 ,設此堆值為 “value2” ,在當前例子中,value1是可改變的,value2是不可改變的,除非是重新賦值,
比如:
// 堆值,即value1,可改變 var a = {"name":"jack"}; a = [];//重新賦值 console.log(a)// [] // 堆值中值,即value2,與基本資料型別一樣不可改變 var a = {"name":"jack"}; a.name[0] = "0"; console.log(a)// {"name":"jack"}
三.傳值與傳址
3.1 傳值, 如下圖所示

基礎型別傳值,A代碼塊執行,a和b都會在堆疊區開辟一個空間用來存放值10,并且以key-value形式存放,
3.2 傳址, 如下圖所示

參考型別傳址,上圖示例代碼塊執行,a會開辟一個空間用來存放指標地址,然后a的指標地址會賦值給b,即b同樣會開辟一個空間用來放指標地址,而a,b指標地址指向的都是堆區的"堆值",即value1,
四.比較
4.1 基礎型別的比較是值的比較
比如:
var a = 1; var b = 1; console.log(a == b);//true
4.2 參考型別的比較是參考的比較
同一個參考比較是可以相等,因為指向同一個地方的地址可能是一樣的;不同參考的比較不等,因為指向兩個不同地方的地址是不一樣的,
比如:
//不同參考的比較 var p1 = {}; var p2 = {}; console.log(p1 == p2) //false //不同參考的比較 var p3 = {"name":{},"age":30}; var p4 = {"name":{},"age":30}; console.log(p3.name == p4.name);//false(這個是參考比較) console.log(p3.age == p4.age);//true(這個是值比較) //同參考的比較 var p5 = {}; var p6 = p5; console.log(p5 == p6)//true
如果參考被賦值別的型別,那么當前參考會被切斷和值的聯系,也就是指標地址,
如下圖:

當a1重新賦值的時候,a1和 “ 堆值--> {} ” 的聯系被替換成新的指標地址,即“ 堆值--> [] ”
五.總結
基本資料型別賦值僅限于堆疊內傳遞并且傳遞的是值,參考資料型別的堆疊內傳遞的是堆疊和堆的聯系地址,值是放在堆里面不動,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/178091.html
標籤:JavaScript
上一篇:Webpack 入門教程
