ES6使用 const 聲明過程詳解
一、不屬于頂層對(duì)象window
使用const關(guān)鍵字 聲明的變量,不會(huì)掛載到window屬性上
const a = 5 console.log(a) console.log(window.a) // 5 // undefined
二、不允許重復(fù)聲明
使用const關(guān)鍵字不允許重復(fù)聲明相同的變量
cosnt a = 5 cosnt a = 6 // Uncaught SyntaxError: Unexpected identifier 'a' 不能重復(fù)聲明a
三、不存在變量提升
使用const 關(guān)鍵字聲明的變量,不會(huì)把變量提前代碼最前面聲明,而是執(zhí)行時(shí)聲明
四、暫時(shí)性死區(qū)
暫時(shí)性死區(qū):先使用了變量, 后 使用 const 關(guān)鍵字 聲明,就會(huì)出現(xiàn)暫時(shí)性死區(qū)
if(true) { console.log(a) const a = 5 } // Uncaught ReferenceError: Cannot access 'a' before initialization // 初始化前無法訪問a
五、塊級(jí)作用域
再大括號(hào)里面,使用const關(guān)鍵字聲明的變量,就會(huì)產(chǎn)生有塊級(jí)作用域的,只能在大括號(hào)內(nèi)部使用,大括號(hào)外無法使用
if (true) { const a = 5 } console.log(a) // Uncaught ReferenceError: a is not defined // a 再大括號(hào)外沒有聲明
六、const的獨(dú)有特性
1. 定義
1.常量: 使用const關(guān)鍵字聲明的變量,叫做常量,不能被修改
2. 聲明常量的方式
ES5中聲明一個(gè)常量
// 定義一個(gè)新的屬性 Object.defineProperty(window, 'PI', { value: 3.14, writable: false, // 是否可修改的, false表示不可以修改 }) console.log(PI) // 3.14 PI = 5 console.log(PI) // 3.14 ,因?yàn)椴豢梢员恍薷?/pre>
2.ES6 中聲明一個(gè)常量
const a = 5; a = 6; // Uncaught TypeError: Assignment to constant variable. // 不能修改常量的值
3. 常量必須再聲明時(shí)賦值
const a; a = 5 // Uncaught SyntaxError: Missing initializer in const declaration // 常量必須再聲明時(shí)賦值
4. 使用const 聲明的變量 為對(duì)象時(shí),可以被修改
const obj = { name: 'xiaoxiao', age: 18 } console.log(obj) // {name: 'xiaoxiao', age: 18} obj.school = 'imooc' console.log(obj) // {name: 'xiaoxiao', age: 18, school: 'imooc'}
5. JS 中的變量是如何存儲(chǔ)的
JS 里面有兩種存儲(chǔ)形式,一種叫棧內(nèi)存(stack),一種叫堆內(nèi)存(heap)
1.基本數(shù)據(jù)類型(Boolean、Null、Undefined、Number、String、Symbol) 是存儲(chǔ)在棧內(nèi)存里面
2.引用數(shù)據(jù)類型:Object(在JS中除了基本數(shù)據(jù)類型以外的都是對(duì)象,數(shù)據(jù)是對(duì)象,函數(shù)是對(duì)象,正則表達(dá)式是對(duì)象)是存儲(chǔ)在堆內(nèi)存里面的
PS:使用const關(guān)鍵字聲明的變量,變量屬于基本類型,即使用棧內(nèi)存進(jìn)行存儲(chǔ),則不可以修改
PS:使用const關(guān)鍵字聲明的變量,變量屬于引用數(shù)據(jù)類(對(duì)象),即使用堆內(nèi)存進(jìn)行存儲(chǔ),就可以修改
const arr = [1, 2, 3] arr.push(4) console.log(arr) // [1,2,3,4]
PS: const定義的變量,基本數(shù)據(jù)類型不能夠被重新賦值,引用數(shù)據(jù)類型可以被重新賦值, 因?yàn)橐脭?shù)據(jù)類型真正是存儲(chǔ)在堆內(nèi)存里面的,const聲明的常量不改動(dòng),指的是變量所指向的哪個(gè)內(nèi)存地址不能改動(dòng),引用數(shù)據(jù)類型引用地址沒有改變,只是地址里面存儲(chǔ)的東西改變了。
生活例子:使用const聲明一個(gè)變量, 當(dāng)變量為基礎(chǔ)數(shù)據(jù)類型時(shí),是一個(gè)具體的實(shí)物, 并且內(nèi)部空間所存放的東西不能被改變,就像一個(gè)蘋果、梨子、一個(gè)人, 一個(gè)動(dòng)物,你把蘋果里面蘋果核替換成梨子核, 它就不是一個(gè)蘋果了。
使用const聲明一個(gè)變量,當(dāng)變量為引用數(shù)據(jù)類型時(shí),就像是一個(gè)容器,比如 書包、盒子、內(nèi)部空間所存放的東西可以改變,書包里面放了書籍,可以替換成漫畫,它還是一個(gè)書包
6. 如何使const 聲明變量為對(duì)象時(shí),不可以改變呢
1.Object.freeze 凍結(jié)一個(gè)對(duì)象的屬性,不能被修改
const obj = { name: 'xiaoxiao', age: 18 } Object.freeze(obj) console.log(obj) // {name: 'xiaoxiao', age: 18} obj.school = 'imooc' console.log(obj) // {name: 'xiaoxiao', age: 18}
2.Object.freeze 只能凍結(jié)對(duì)象的第一層屬性
const obj = { name: 'xiaoxiao', age: 18, sikll: { name: 'code', year: 11 } } Object.freeze(obj) obj.school = 'imooc' obj.sikll.year = 13 console.log(obj) /* { "name": "xiaoxiao", "age": 18, "sikll": { "name": "code", "year": 13 } } */
PS:第二層的屬性沒有被凍結(jié)
3.如何凍結(jié)第二層
const obj = { name: 'xiaoxiao', age: 18, sikll: { name: 'code', year: 11 } } Object.freeze(obj) // 凍結(jié)第一層屬性,不可以被修改 Object.freeze(obj.sikll) // 凍結(jié)第二層屬性,不可以被修改 obj.school = 'imooc' obj.sikll.year = 13 console.log(obj) /* { "name": "xiaoxiao", "age": 18, "sikll": { "name": "code", "year": 11 } } */
4.Object.freeze 凍結(jié)數(shù)組后,再給數(shù)組添加值,會(huì)報(bào)錯(cuò)
const arr = [1,2,3] Object.freeze(arr) arr.push(4) console.log(arr) // Uncaught TypeError: Cannot add property 3, object is not extensible // 無法添加屬性 3,對(duì)象不可擴(kuò)展
七. const和let的使用場(chǎng)景
1.當(dāng)你定義當(dāng)前變量時(shí),需要考慮當(dāng)前變量再后續(xù)邏輯中,是否會(huì)被改變,如果確認(rèn)后續(xù)不會(huì)被改變,則使用const,如果確認(rèn)后續(xù)會(huì)被改變,則使用let。
到此這篇關(guān)于ES6使用 const 聲明的文章就介紹到這了,更多相關(guān)ES6使用 const 聲明內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用webpack-dev-server處理跨域請(qǐng)求的方法
本篇文章主要介紹了使用webpack-dev-server處理跨域請(qǐng)求的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04javascript this指向相關(guān)問題及改變方法
這篇文章主要介紹了javascript this指向相關(guān)問題及改變方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Javascript之高級(jí)數(shù)組API的使用實(shí)例
今天小編就為大家分享一篇關(guān)于Javascript之高級(jí)數(shù)組API的使用實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03Ajax跨域?qū)崿F(xiàn)代碼(后臺(tái)jsp)
這篇文章主要介紹了Ajax跨域?qū)崿F(xiàn)代碼(后臺(tái)jsp),需要的朋友可以參考下2017-01-01