今天咱們來聊下 ES6 的另外一個 關鍵字 const
1、const 關鍵字
const 是 constant(常量)的縮寫,const 和 let 同樣也是來聲明變量的,但 const 是專門用來聲明一個常量的,那麼既然是常量,它的值是不能改變的。不像之前用 var 聲明的變量 隨便改。
可見,碰到const 該改收收大家任性的代碼了!
2、談談常量
1.不可修改
const Name='張';
Name = 'zhang' // 錯誤,不可修改常量 Name
2.只在塊級做用域起做用,這點和 let 同樣
if (x) {
const Name='張'
}
alert(Name) // 錯誤,在代碼塊{}外,Name 不起做用
3.不存在變量提高,必須先聲明後使用,也和 let 同樣
if (x) {
alert(Name) // 錯誤,使用前未聲明
const Name='張'
}
4.不可重複聲明同一個變量也和 let 同樣
var Name='張' ;
const Name='張' // 錯誤 變量已經聲明 ,不可重複聲明
5.聲明後必需要賦值
const NAME; // 錯誤 聲明後沒賦值
3、const 聲明 對象
先看代碼
const Person = {
'name':'張'
}
Person.name='王';
Person.age=20;
console.log(Person) // 輸出 {'name':'王','age':20 }
不是說好的常量不能修改麼。搞事情...
淡定 , 聽我說!
這裏現講一個概念:傳址賦值
在賦值過程當中,咱們分爲傳值賦值和 傳址賦值 ,這裏就講講咱們用到的 傳址賦值
傳址:在賦值過程當中,變量存儲的其實是 數據的地址,而不是原始數據 或者對數據的拷貝。
不太明白,沒事,先看代碼
var person1={'name':'張'}
var person2=person1
person2.name='王'
console.log(person1) // 輸出 {name:'王'}
console.log(person2) // 輸出 {name:'王'}
爲何person2 的name 改了之後 person1 的也變了,這就是傳址賦值
舉個例子:好比 你預定了一個染髮師小王,小王沿着你給的地址來了你家 給你把頭髮染成 奶奶灰色。
過了幾天,你以爲他染得不行並且髮色 很差看,又預定了小李,小李沿着地址一樣來到你家,給你把頭髮改善了下,並染成 亞麻色。
那麼無論誰來你家,按你地址來的見到你 髮色 必定是 亞麻色,由於,最後一次 的染髮 是亞麻色。
再看代碼
// 小王給你染得奶奶灰
var wang={hair:'奶奶灰'}
// 過了幾天,你讓小李來,並告訴了他地址
var li=wang
// 小李給你染得亞麻色
var li={hair:'亞麻色'}
// 那麼無論誰來你家,你的髮色必定是亞麻色
console.log(wang) // 輸出 {'hair':'亞麻色'}
console.log(li) // 輸出 {'hair':'亞麻色'}
翻到開始的那個代碼,結構都同樣,應該明白了吧。
回到咱們的關鍵字 const ,用 const 來聲明 一個對象類型的常量,就是傳址賦值。而不可修改的是 對象在內存中的地址,而不是對象自己(不變的你家的地址而不是你的髮色)
因此上面那段代碼console 的時候能正常輸出了
var person1={'name':'張'}
var person2=person1
person2.name='王'
console.log(person1) // 正常輸出 {name:'王'}
console.log(person2) // 正常輸出 {name:'王'}
可是,若是這樣寫就要報錯了
var person1={'name':'張'}
person1={} // 錯誤,給常量person1 從新賦值(即改變你家地址)
小結:
const是用於聲明一個常量,並必須賦值,聲明後不可修改,和 let 同樣,只在塊級做用域 起做用,不可重複聲明同一個變量,不會有變量提高的狀況,聲明引用類型的常量時,要注意傳址賦值。
ok!