ES6使用 const 聲明過程詳解
一、不屬于頂層對象window
使用const關鍵字 聲明的變量,不會掛載到window屬性上
const a = 5 console.log(a) console.log(window.a) // 5 // undefined
二、不允許重復聲明
使用const關鍵字不允許重復聲明相同的變量
cosnt a = 5 cosnt a = 6 // Uncaught SyntaxError: Unexpected identifier 'a' 不能重復聲明a
三、不存在變量提升
使用const 關鍵字聲明的變量,不會把變量提前代碼最前面聲明,而是執(zhí)行時聲明
四、暫時性死區(qū)
暫時性死區(qū):先使用了變量, 后 使用 const 關鍵字 聲明,就會出現(xiàn)暫時性死區(qū)
if(true) {
console.log(a)
const a = 5
}
// Uncaught ReferenceError: Cannot access 'a' before initialization
// 初始化前無法訪問a五、塊級作用域
再大括號里面,使用const關鍵字聲明的變量,就會產生有塊級作用域的,只能在大括號內部使用,大括號外無法使用
if (true) {
const a = 5
}
console.log(a)
// Uncaught ReferenceError: a is not defined
// a 再大括號外沒有聲明六、const的獨有特性
1. 定義
1.常量: 使用const關鍵字聲明的變量,叫做常量,不能被修改
2. 聲明常量的方式
ES5中聲明一個常量
// 定義一個新的屬性
Object.defineProperty(window, 'PI', {
value: 3.14,
writable: false, // 是否可修改的, false表示不可以修改
})
console.log(PI) // 3.14
PI = 5
console.log(PI) // 3.14 ,因為不可以被修改2.ES6 中聲明一個常量
const a = 5; a = 6; // Uncaught TypeError: Assignment to constant variable. // 不能修改常量的值
3. 常量必須再聲明時賦值
const a; a = 5 // Uncaught SyntaxError: Missing initializer in const declaration // 常量必須再聲明時賦值
4. 使用const 聲明的變量 為對象時,可以被修改
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 中的變量是如何存儲的
JS 里面有兩種存儲形式,一種叫棧內存(stack),一種叫堆內存(heap)
1.基本數(shù)據(jù)類型(Boolean、Null、Undefined、Number、String、Symbol) 是存儲在棧內存里面
2.引用數(shù)據(jù)類型:Object(在JS中除了基本數(shù)據(jù)類型以外的都是對象,數(shù)據(jù)是對象,函數(shù)是對象,正則表達式是對象)是存儲在堆內存里面的

PS:使用const關鍵字聲明的變量,變量屬于基本類型,即使用棧內存進行存儲,則不可以修改
PS:使用const關鍵字聲明的變量,變量屬于引用數(shù)據(jù)類(對象),即使用堆內存進行存儲,就可以修改
const arr = [1, 2, 3] arr.push(4) console.log(arr) // [1,2,3,4]
PS: const定義的變量,基本數(shù)據(jù)類型不能夠被重新賦值,引用數(shù)據(jù)類型可以被重新賦值, 因為引用數(shù)據(jù)類型真正是存儲在堆內存里面的,const聲明的常量不改動,指的是變量所指向的哪個內存地址不能改動,引用數(shù)據(jù)類型引用地址沒有改變,只是地址里面存儲的東西改變了。
生活例子:使用const聲明一個變量, 當變量為基礎數(shù)據(jù)類型時,是一個具體的實物, 并且內部空間所存放的東西不能被改變,就像一個蘋果、梨子、一個人, 一個動物,你把蘋果里面蘋果核替換成梨子核, 它就不是一個蘋果了。
使用const聲明一個變量,當變量為引用數(shù)據(jù)類型時,就像是一個容器,比如 書包、盒子、內部空間所存放的東西可以改變,書包里面放了書籍,可以替換成漫畫,它還是一個書包
6. 如何使const 聲明變量為對象時,不可以改變呢
1.Object.freeze 凍結一個對象的屬性,不能被修改
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 只能凍結對象的第一層屬性
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:第二層的屬性沒有被凍結
3.如何凍結第二層
const obj = {
name: 'xiaoxiao',
age: 18,
sikll: {
name: 'code',
year: 11
}
}
Object.freeze(obj) // 凍結第一層屬性,不可以被修改
Object.freeze(obj.sikll) // 凍結第二層屬性,不可以被修改
obj.school = 'imooc'
obj.sikll.year = 13
console.log(obj)
/*
{
"name": "xiaoxiao",
"age": 18,
"sikll": {
"name": "code",
"year": 11
}
}
*/4.Object.freeze 凍結數(shù)組后,再給數(shù)組添加值,會報錯
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,對象不可擴展
七. const和let的使用場景
1.當你定義當前變量時,需要考慮當前變量再后續(xù)邏輯中,是否會被改變,如果確認后續(xù)不會被改變,則使用const,如果確認后續(xù)會被改變,則使用let。
到此這篇關于ES6使用 const 聲明的文章就介紹到這了,更多相關ES6使用 const 聲明內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

