前面簡單講解了數(shù)組,字符串,對象的一些api;不太完全,后續(xù)在補(bǔ)充,接下來更新ES6的新特性:
let:
作用:用來聲明變量,它的用法類似與var。但是注意:let所聲明的變量,只有在let命令所在的代碼塊內(nèi)有效;
實(shí)例:
{
let a=10;
var b=1;
}
a? // ReferenceError:a is not defined? 報錯
b? // 1
這表明,let聲明的變量只在它所在的代碼塊有效;
for循環(huán)的計數(shù)器,就很適合使用let命令。
for(? let i=0;i<10;i++){
? ? ? ? ?// ...
}
console.log(i);? // ReferenceError: i is not defined
此時在外面打印這個i,就會報錯,i只在for循環(huán)體內(nèi)有效;
但是如果用 var 代替 let 最后 輸出結(jié)果 就為 10??

這是什么原理?這就涉及到作用域了。
上面這個實(shí)例中, i? 是用 var 聲明的,在全局范圍內(nèi)有效,所有全局變量只有一個 i ;每循環(huán)一次,i 的 值都會改變,而循環(huán)體內(nèi) console.log(? i? )指向的是全局的 i ;所以 ,最后輸出的是最后一輪的 i 的值? 為 10 ;
但是 ,如果是用 let 聲明 的 i ,i 僅在塊級作用域內(nèi)有效
除此之外, for循環(huán)有一個特別之處
就是設(shè)置循環(huán)變量的那一部分是父作用域,而循環(huán)體里面的是子作用域
具體實(shí)例

可以看到輸出三次 abc 要記住同一個作用域內(nèi) 不可以用let 重復(fù)聲明同一個變量? 而從輸出結(jié)果來看,并沒有報錯,由此說明,兩個并沒有在同一個作用域內(nèi),
let? 不存在變量提示
var 可以先聲明在定義? 而let 不行?
具體實(shí)例:

瀏覽器在加載代碼時,會發(fā)生預(yù)解析(變量提示) ,預(yù)解析會把所以帶var 的和function 進(jìn)行預(yù)解析 ;var 只聲明不定義 , function 聲明 + 定義 ;
而let 聲明的變量一定要跟在聲明之后 ;
暫時性死區(qū);
ES6中明確規(guī)定:如果區(qū)塊中存在let 和const命令,這個區(qū)塊對這些命名聲明的變量。從開始就形成了封閉塊級作用域,凡是在聲明之前就是用這些變量,就會報錯。
總之,在代碼塊內(nèi),使用let命名聲明變量之前,該變量都是不可用的,在語法上稱為“暫時性死區(qū)”(temporal dead zone,簡稱 TDZ)
const :
作用:聲明一個常量,一旦聲明,此值就不可改變;
看下實(shí)例:

聲明一個PI的常量,再給他重新賦值就會拋錯;就意味這,一旦聲明必須的賦值,否則報錯

const 和 let 一樣 只在聲明的塊作用域內(nèi)有效,同時和let一樣也存在暫時性死區(qū);
如果常量保存的值為引用類型(復(fù)雜類型),只能保證引用類型的地址不能被改變,而地址指向的內(nèi)容是可以修改的


let 和const 與window 解綁
var a = "ok";
console.log( window.a );
let c= "ok";
console.log( window.c );
const b = "javascript";
console.log( window.b );

在這里再講一下頂層對象:
瀏覽器的頂層對象為window,在node中頂層對象為goobal。在ES5中頂層對象的屬性和全局變量是等價的。

在ES6中,let ,const 聲明的全局變量都不屬于頂層對象的屬性,但是var和function聲明的全局變量,仍然是window的屬性