javascript原始值和引用值型別及區別

clearYang發表於2021-12-27

原始值和引用值型別及區別

首先,原始值和引用值型別都是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)

 

相關文章