第三节:ES6中另一个不得不说的关键字const
????????之前感覺(jué)在微信上看含有代碼的文章體驗(yàn)很差,特別是閱讀代碼的時(shí)候,這次我給代碼部分著色了,希望大家能看得舒服點(diǎn);還有配上了圖,更有趣好玩了,堅(jiān)持一個(gè)宗旨:相信編程講課可以更通俗易懂、更有趣。也歡迎大家積極互動(dòng)。
????????上一節(jié)講了let關(guān)鍵字,它是用來(lái)聲明一個(gè)變量,只在塊級(jí)作用域起作用。這一節(jié)我們來(lái)學(xué)習(xí)ES6新增的另一個(gè)關(guān)鍵字const。
const 的作用
????????const是constant(常量)的縮寫,const和 let一樣,也是用來(lái)聲明變量的,但是const是專門用于聲明一個(gè)常量的,顧名思義,常量的值是不可改變的。以前用var聲明的變量,想怎么改就怎么改,同一個(gè)變量,后面的值可以輕松覆蓋原來(lái)的值,這次const聲明的變量,可由不得我們這么任性地想改就改了。
常量的特點(diǎn)
1、不可修改
? ?const Name = '張三';
? ?Name = '李四';//錯(cuò)誤,企圖修改常量Name
2、只在塊級(jí)作用域起作用,這點(diǎn)與let關(guān)鍵字一樣。
? ?? ?if(1){
? ? ? const Name = '張三';
? ? }
? ?alert(Name);//錯(cuò)誤,在代碼塊{ }外,Name失效
?
3、不存在變量提升,必須先聲明后使用,這點(diǎn)也跟let關(guān)鍵字一樣。
?????? if(1){
??????? alert(Name);//錯(cuò)誤,使用前未聲明
??????? const Name = '張三';
??? }
???
4、不可重復(fù)聲明同一個(gè)變量,這點(diǎn)跟let也一樣。
? ?var Name ?= '張三';
? ?const ?Name = '李四';//錯(cuò)誤,聲明一個(gè)已經(jīng)存在的變量Name
5、聲明后必須要賦值
?? ?const NAME; //錯(cuò)誤,只聲明不賦值
??????
????????以上這些小知識(shí)點(diǎn)都比較簡(jiǎn)單,不用舉生活上的例子都可以理解,也不難記住。
如果常量是一個(gè)對(duì)象呢?
我們接著看下面這段小代碼:
? ?const Person = {"name":"張三"};
? ?Person.name = "李四";
? ?Person.age = 20;
? ?console.log(Person);
? ?//結(jié)果:正常輸出{name: "李四", age: 20}
?????????咦?怎么常量Person好像被修改了,name改成了“李四”,而且還添加了age屬性,值為20;怎么沒(méi)有報(bào)錯(cuò),還正常輸出,不是說(shuō)好了常量不可修改嗎,友誼小船說(shuō)翻就翻了,說(shuō)好的常量說(shuō)變就變,別怕,友誼還是很牢固的。
????????我們一起來(lái)找找原因。
傳址賦值
????????這個(gè)時(shí)候,我們先引入一個(gè)概念:在賦值過(guò)程中,我們可以分為傳值賦值和傳址賦值。這里我們用到了傳址賦值,什么叫傳址賦值?
傳址:在賦值過(guò)程中,變量實(shí)際上存儲(chǔ)的是數(shù)據(jù)的地址(對(duì)數(shù)據(jù)的引用),而不是原始數(shù)據(jù)或者數(shù)據(jù)的拷貝。
新手看不懂上面這段話,沒(méi)關(guān)系的,看段代碼:
? ?var student1 = {"name":"張三"};
? ?var student2 = student1;
? ?student2.name = "李四";
? ?console.log(student1);
? ?//結(jié)果:輸出 {name: "李四"}
? ?console.log(student2);
? ?//結(jié)果:輸出 {name: "李四"}
????????為什么student2的name改成了“李四”,student1的那么也變成了“李四”呢?這就是傳址賦值!
????????怎么理解傳址賦值?就好比,你預(yù)約了一個(gè)裝修工(張師傅)到你家進(jìn)行裝修,你把你家的地址告訴了他,他順著地址來(lái)到你家,按照你的要求,把你家的門弄成紅色。
????????僅僅過(guò)了兩天,你覺(jué)得不好看,你又找了另一個(gè)裝修工(王師傅),你也把地址告訴他,王師傅來(lái)到后也是按照你的要求,把門弄成了綠色。
????????最后,不管是張師傅還是王師傅,通過(guò)這個(gè)地址來(lái)到你家的時(shí)候,看到的門肯定是綠色的,因?yàn)樽詈笠淮涡薷氖歉某删G色。
????????看懂這個(gè)生活上的的例子,你就看得懂下面這段代碼了:
? ?//張師傅把你家的門改成紅色
? ?var Zhang = {"door":"red"};
? ?//次日,你把地址也告訴了王師傅
? ?var Wang = Zhang;
? ?//王師傅按照地址,去到后把門改成綠色
? ?Wang.door = "green";
? ?//最后不管是張師傅還是王師傅來(lái)到你家,看到門都是綠色的
? ?console.log(Wang); //結(jié)果:輸出 {door: "green"}
? ?console.log(Zhang); //結(jié)果:輸出 {door: "green"}
? ? ? ? 仔細(xì)對(duì)比一下,這段代碼和上一段小代碼的結(jié)構(gòu)一模一樣(往上翻一下看看),這就知道為什么student2改了name,student1也被修改了。
????????花了不少篇幅來(lái)講傳址賦值,希望這個(gè)例子能形象地描述出傳址賦值,讓大家易懂和透徹。
????????講完傳址賦值,回到我們的const關(guān)鍵字,用const來(lái)聲明一個(gè)對(duì)象類型的常量,就是傳址賦值。而不可修改的是對(duì)象在內(nèi)存中的地址,而不是對(duì)象本身(不可變的是你家的地址,而不是你家的門)。
????????所以,這就很好的解釋剛剛的這段代碼為什么不會(huì)報(bào)錯(cuò),而是正常輸出了。
? ?const Person = {"name":"張三"};
? ?Person.name = "李四";
? ?Person.age = 20;
? ?console.log(Person);
? ?//結(jié)果:正常輸出{name: "李四", age: 20}
因?yàn)樾薷牡闹皇荘erson本身,修改的是name屬性和增加一個(gè)屬性age,而地址沒(méi)變,也不可變,所以并沒(méi)有違背常量不可修改的約定。
但是,如果這樣寫呢,就會(huì)報(bào)錯(cuò):
? ?const Person = {"name":"張三"};
? ?Person.age = 20;
? ?Person = {};?
? ?//錯(cuò)誤,企圖給常量Person賦新值(新地址)
????????用const聲明后,張師傅、王師傅就只認(rèn)得你家的地址了,不能再告訴他其他家的地址。
????????const關(guān)鍵字的學(xué)習(xí)到此就結(jié)束了,是不是發(fā)現(xiàn)并不難學(xué),大部分特性都跟let的相同,但記住聲明一個(gè)對(duì)象作為常量的時(shí)候要小心。此外附帶講解了傳址賦值的概念,裝修工的例子還算貼切,圖文并茂,比較形象地描述傳址賦值。
本節(jié)總結(jié)
總結(jié):const也是用于聲明一個(gè)常量,并必須賦值,聲明后不可修改,跟let一樣,只在塊級(jí)作用域起作用,不可重復(fù)聲明同一個(gè)變量,不會(huì)變量提升,聲明引用類型的常量時(shí),要注意是傳址賦值。
總結(jié)
以上是生活随笔為你收集整理的第三节:ES6中另一个不得不说的关键字const的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [云炬创业基础笔记]第二章创业者测试8
- 下一篇: [云炬创业基础笔记]第二章创业者测试9