JS中const對于復雜類型變量和普通類型變量的區(qū)別詳解
const關(guān)鍵字是讓什么不能變?
const實際上的不能變并不是說變量的值不能變,而是初始化后變量所指向在棧中的內(nèi)存上的數(shù)據(jù)不能變
我們先切記這一點先,看下文?。?!
js中變量的兩種類型
js中的變量類型可以分為兩種:
簡單數(shù)據(jù)類型
Number
String
Boolean
Undefined
null
symbol
復雜數(shù)據(jù)類型(下面我都稱為對象)
Object
Array
Function(函數(shù)實際上是對象)
兩種類型的的存儲區(qū)別
堆和棧都是兩種數(shù)據(jù)結(jié)構(gòu),靠他們來給變量分配使用內(nèi)存
而js的兩種數(shù)據(jù)類型的變量即是存儲在堆和棧中
簡單類型變量的存儲
這種類型的變量我們是用得最多的
它是存儲在棧中而已
以下是的示例定義
var num=100 var bool=false var str='字符串
而他在棧中的存儲可以形象比喻為這樣子

其中變量的值存儲在變量指向的棧中的內(nèi)存地址上,看上圖,100就是存儲在內(nèi)存地址上
結(jié)合上面所說的const的作用就知道為什么const關(guān)鍵字定義的簡單類型的變量的值不能變,因為改變其變量的值是直接改變變量指向的內(nèi)存上的數(shù)據(jù),這是const關(guān)鍵字不允許的
那為什么復雜類型的又可以呢,看下文
復雜類型變量的存儲
先說一下,復雜類型的值的更改指的是
復雜類型變量里屬性可以更改,整個對象的更改const關(guān)鍵字是不允許的?。?!
比如
const ob={
a:100,
b:200
}
const ob1={
c:100
}
ob.a=200 // successful ! ! !
ob=ob1 // fail ! ! !
如果需要替換整個對象,const關(guān)鍵字是不允許的,但是屬性值的更改是可以的
那這又是為什么 ? 看下面
我們先要記住const關(guān)鍵字是不允許更改變量的哪個地方,是變量在棧中存儲變量值的內(nèi)存地址上的值
對,沒錯 ?。?!這也是普通變量值不能更改的原因
但是為什么復雜變量的可以更改呢,但是不可以替換呢
主要原因是:
復雜變量的值不是存儲在棧中,而是存儲在堆里,復雜變量在棧中內(nèi)存上的值是指向存儲該復雜類型變量值的堆上的地址
如果這句話看不懂的話,可以看下圖

所以更改對象的屬性值是更改在堆上的值,而替換對象則是要更改存儲在棧中內(nèi)存地址上變量在堆上存儲數(shù)據(jù)的地址值,而這個更改恰恰是const關(guān)鍵字不允許的!?。?/p>
這也是為什么會有對象的淺拷貝和深拷貝的原因,因為你把一個對象直接賦值給另一個對象,準確來說是把對象變量在棧中的存儲的指向改變了,指向了同一個在堆里存儲的數(shù)據(jù),所以你改變其中一個變量的值,會造成其堆上存儲的數(shù)據(jù)改變,所以另外一個對象的值也會改變,這就是為啥會有淺拷貝!?。?/p>
以上就是JS中const對于復雜類型變量和普通類型變量的區(qū)別詳解的詳細內(nèi)容,更多關(guān)于JS const復雜類型和普通類型變量區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript實現(xiàn)簡易天數(shù)計算器
這篇文章主要為大家詳細介紹了Javascript實現(xiàn)簡易天數(shù)計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05
詳解TypeScript中type與interface的區(qū)別
在寫 ts 相關(guān)代碼的過程中,總能看到 interface 和 type 的身影。它們的作用好像都一樣的,相同的功能用哪一個都可以實現(xiàn),也都很好用,所以也很少去真正的理解它們之間到底有啥區(qū)別,因此本文將詳細講解二者的區(qū)別,需要的可以參考一下2022-04-04
詳解js location.href和window.open的幾種用法和區(qū)別
這篇文章主要介紹了詳解js location.href和window.open的幾種用法和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
uniapp中解析markdown支持網(wǎng)頁和小程序?qū)崿F(xiàn)示例
這篇文章主要為大家介紹了uniapp中解析markdown支持網(wǎng)頁和小程序?qū)崿F(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
JavaScript this關(guān)鍵字指向常用情況解析
這篇文章主要介紹了JavaScript this關(guān)鍵字指向常用情況解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
uniapp?H5遮罩層、彈窗以及蒙層滾動穿透/滑動穿透解決辦法
最近用uin-app做項目遇到了不少問題,下面這篇文章主要給大家介紹了關(guān)于uniapp?H5遮罩層、彈窗以及蒙層滾動穿透/滑動穿透的解決辦法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01

