JS中const對(duì)于復(fù)雜類(lèi)型變量和普通類(lèi)型變量的區(qū)別詳解
const關(guān)鍵字是讓什么不能變?
const
實(shí)際上的不能變并不是說(shuō)變量的值不能變,而是初始化后變量所指向在棧中的內(nèi)存上的數(shù)據(jù)不能變
我們先切記這一點(diǎn)先,看下文?。?!
js中變量的兩種類(lèi)型
js中的變量類(lèi)型可以分為兩種:
簡(jiǎn)單數(shù)據(jù)類(lèi)型
Number
String
Boolean
Undefined
null
symbol
復(fù)雜數(shù)據(jù)類(lèi)型(下面我都稱為對(duì)象)
Object
Array
Function(函數(shù)實(shí)際上是對(duì)象)
兩種類(lèi)型的的存儲(chǔ)區(qū)別
堆和棧都是兩種數(shù)據(jù)結(jié)構(gòu),靠他們來(lái)給變量分配使用內(nèi)存
而js
的兩種數(shù)據(jù)類(lèi)型的變量即是存儲(chǔ)在堆和棧中
簡(jiǎn)單類(lèi)型變量的存儲(chǔ)
這種類(lèi)型的變量我們是用得最多的
它是存儲(chǔ)在棧中而已
以下是的示例定義
var num=100 var bool=false var str='字符串
而他在棧中的存儲(chǔ)可以形象比喻為這樣子
其中變量的值存儲(chǔ)在變量指向的棧中的內(nèi)存地址上,看上圖,100
就是存儲(chǔ)在內(nèi)存地址上
結(jié)合上面所說(shuō)的const的作用就知道為什么const關(guān)鍵字定義的簡(jiǎn)單類(lèi)型的變量的值不能變,因?yàn)?strong>改變其變量的值是直接改變變量指向的內(nèi)存上的數(shù)據(jù),這是const關(guān)鍵字不允許的
那為什么復(fù)雜類(lèi)型的又可以呢,看下文
復(fù)雜類(lèi)型變量的存儲(chǔ)
先說(shuō)一下,復(fù)雜類(lèi)型的值的更改指的是
復(fù)雜類(lèi)型變量里屬性可以更改,整個(gè)對(duì)象的更改const關(guān)鍵字是不允許的!??!
比如
const ob={ a:100, b:200 } const ob1={ c:100 } ob.a=200 // successful ! ! ! ob=ob1 // fail ! ! !
如果需要替換整個(gè)對(duì)象,const
關(guān)鍵字是不允許的,但是屬性值的更改是可以的
那這又是為什么 ? 看下面
我們先要記住const
關(guān)鍵字是不允許更改變量的哪個(gè)地方,是變量在棧中存儲(chǔ)變量值的內(nèi)存地址上的值
對(duì),沒(méi)錯(cuò) !??!這也是普通變量值不能更改的原因
但是為什么復(fù)雜變量的可以更改呢,但是不可以替換呢
主要原因是:
復(fù)雜變量的值不是存儲(chǔ)在棧中,而是存儲(chǔ)在堆里,復(fù)雜變量在棧中內(nèi)存上的值是指向存儲(chǔ)該復(fù)雜類(lèi)型變量值的堆上的地址
如果這句話看不懂的話,可以看下圖
所以更改對(duì)象的屬性值是更改在堆上的值,而替換對(duì)象則是要更改存儲(chǔ)在棧中內(nèi)存地址上變量在堆上存儲(chǔ)數(shù)據(jù)的地址值,而這個(gè)更改恰恰是const
關(guān)鍵字不允許的?。?!
這也是為什么會(huì)有對(duì)象的淺拷貝和深拷貝的原因,因?yàn)槟惆岩粋€(gè)對(duì)象直接賦值給另一個(gè)對(duì)象,準(zhǔn)確來(lái)說(shuō)是把對(duì)象變量在棧中的存儲(chǔ)的指向改變了,指向了同一個(gè)在堆里存儲(chǔ)的數(shù)據(jù),所以你改變其中一個(gè)變量的值,會(huì)造成其堆上存儲(chǔ)的數(shù)據(jù)改變,所以另外一個(gè)對(duì)象的值也會(huì)改變,這就是為啥會(huì)有淺拷貝?。。?/p>
以上就是JS中const對(duì)于復(fù)雜類(lèi)型變量和普通類(lèi)型變量的區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于JS const復(fù)雜類(lèi)型和普通類(lèi)型變量區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript 學(xué)習(xí)書(shū) 推薦
前一段時(shí)間看了一本javascript的書(shū),書(shū)名為Javascript DOM 高級(jí)程序設(shè)計(jì) 由【加】Jeffrey Sambells和【美】2009-06-06JS定時(shí)器如何實(shí)現(xiàn)提交成功提示功能
這篇文章主要介紹了JS定時(shí)器如何實(shí)現(xiàn)提交成功提示功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06BootStrap Progressbar 實(shí)現(xiàn)大文件上傳的進(jìn)度條的實(shí)例代碼
這篇文章主要介紹了BootStrap Progressbar 實(shí)現(xiàn)大文件上傳的進(jìn)度條的實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JavaScript function 的 length 屬性使用介紹
函數(shù)的 length 得到的是形參個(gè)數(shù),如果函數(shù)內(nèi)部是通過(guò)arguments 調(diào)用參數(shù),而沒(méi)有實(shí)際定義參數(shù)的話, length 只會(huì)的得到02014-09-09javascript根據(jù)像素點(diǎn)取位置示例
這篇文章主要介紹了javascript根據(jù)像素點(diǎn)取位置的示例,大家參考使用吧2014-01-01微信小程序使用setData修改數(shù)組中單個(gè)對(duì)象的方法分析
這篇文章主要介紹了微信小程序使用setData修改數(shù)組中單個(gè)對(duì)象的方法,結(jié)合具體實(shí)例形式分析了setData進(jìn)行數(shù)組修改的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12