原始值和引用值型別及區別
首先,原始值和引用值型別都是js中的資料型別,為了充分利用儲存空間,定義了不同的資料型別,而且js是弱型別,動態語言,資料型別可變。
原始值(簡單資料型別)
儲存在棧中的簡單資料段,也就是說,它們的值直接儲存在變數訪問的位置。包含五種:undefined,null,boolean,number和string,可以通過typeof來判斷某資料是何簡單資料型別。
引用值(複雜資料型別)
儲存在堆中的物件,放在變數的棧空間中的值是該物件儲存在堆中的地址,也就是說,儲存在變數處的值是一個指標(記憶體地址),指向儲存物件的堆記憶體中,包含Object,array,function等
區別:1.簡單資料型別的值是儲存在棧中,當把一個變數傳遞給另一個變數時,是把一個棧中的東西複製到另一個棧中,並且這兩個變數互不影響,修改其中的變數值時不會改變另一個變數的結果。
var a=10 var b=a a=1 console.log(b)//10
2.引用值是把引用變數的名稱儲存在棧中,但是把實際物件儲存在堆中,棧中的記憶體地址指向堆中的實際物件,當把引用物件傳遞給另一個變數時,複製的其實是指向實際物件的指標(記憶體地址),此時兩者指向的是同一個資料,若通過方法改變其中一個變數的值,則另一個變數的值也會改變,因此,js中物件的複製是預設引用賦值的。
const obj1={ name:'xiaoming' } const obj2=obj1 obj2.name='xiaohong' console.log(obj1)//xiaohong
也是因為上述特點,es6中,const是宣告常量的,賦值後,該值不可改變。
const PI=3.14 PI=2.14//報錯 console.log(PI) //但是 const obj1={ name:'xiaoMing' } obj1.name='xiaoHong' console.log(obj1.name)//xiaoHong
這也是因為,const宣告的obj1指向的是棧中的記憶體地址,此地址不可被修改,但是堆中儲存的資料它是管不著的。
小明的媽媽讓小明看門,家裡的東西被偷光了,門還在。
var obj1={ name:'xiaoMing' } var obj2=Object.assign({},obj1) obj2.name='xiaoHong' console.log(obj1) console.log(obj2)