什么是ES6?
ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn),已經(jīng)在2015年6月正式發(fā)布了。Mozilla公司將在這個(gè)標(biāo)準(zhǔn)的基礎(chǔ)上,推出JavaScript 2.0。
ECMAScript和JavaScript到底是什么關(guān)系?很多初學(xué)者會(huì)感到困惑,簡單來說,ECMAScript是JavaScript語言的國際標(biāo)準(zhǔn),JavaScript是ECMAScript的實(shí)現(xiàn)。
一、let和const
在JavaScript中咱們以前主要用關(guān)鍵var來定義變量,ES6之后,新增了定義變量的兩個(gè)關(guān)鍵字,分別是let和const。
對(duì)于變量來說,在ES5中var定義的變量會(huì)提升到作用域中所有的函數(shù)與語句前面,而ES6中l(wèi)et定義的變量則不會(huì),let聲明的變量會(huì)在其相應(yīng)的代碼塊中建立一個(gè)暫時(shí)性死區(qū),直至變量被聲明。
let和const都能夠聲明塊級(jí)作用域,用法和var是類似的,let的特點(diǎn)是不會(huì)變量提升,而是被鎖在當(dāng)前塊中。
一個(gè)非常簡單的例子:
function test() {if(true) { console.log(a)//TDZ,俗稱臨時(shí)死區(qū),用來描述變量不提升的現(xiàn)象 let a = 1}}test() // a is not definedfunction test() { if(true) {  let a = 1 } console.log(a)} test() // a is not defined唯一正確的使用方法:先聲明,再訪問。
function test() { if(true) {  let a = 1  console.log(a) }}test() // 1const
聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。
const雖然是常量,不允許修改默認(rèn)賦值,但如果定義的是對(duì)象Object,那么可以修改對(duì)象內(nèi)部的屬性值。
const type = { a: 1}type.a = 2 //沒有直接修改type的值,而是修改type.a的屬性值,這是允許的。console.log(type) // {a: 2}const和let的異同點(diǎn)
相同點(diǎn):const和let都是在當(dāng)前塊內(nèi)有效,執(zhí)行到塊外會(huì)被銷毀,也不存在變量提升(TDZ),不能重復(fù)聲明。
不同點(diǎn):const不能再賦值,let聲明的變量可以重復(fù)賦值。
const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)。對(duì)于簡單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針,const只能保證這個(gè)指針是固定的(即總是指向另一個(gè)固定的地址),至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個(gè)對(duì)象聲明為常量必須非常小心。
塊級(jí)作用域的使用場景
除了上面提到的常用聲明方式,我們還可以在循環(huán)中使用,最出名的一道面試題:循環(huán)中定時(shí)器閉包的考題
在for循環(huán)中使用var聲明的循環(huán)變量,會(huì)跳出循環(huán)體污染當(dāng)前的函數(shù)。            
新聞熱點(diǎn)
疑難解答
圖片精選