天天看點

ES6 之關鍵字 const

今天我們來聊下 ES6 的另一個 關鍵字 const

一、const 關鍵字

const 是 constant(常量)的縮寫,const 和 let 一樣也是來聲明變量的,但 const 是專門用來聲明一個常量的,那麼既然是常量,它的值是不能改變的。不像以前用 var 聲明的變量 随便改。
可見,碰到const 該改收收你們任性的代碼了!

二、談談常量

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; // 錯誤 聲明後沒指派           

三、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!

原文釋出時間為:2018年02月07日

原文作者:

前端喵

本文來源:

開源中國

如需轉載請聯系原作者

繼續閱讀