週末兩天學習了ES6基礎內容,包括做用域、變量賦值、字符串、數值、數組、函數、對象這幾項的擴展。總體感受,ES6就是對ES5進行bug修復和功能補充。java
- 局部做用域與letjson
ES5不存在傳統意義上的塊級做用域,若是必定要說有,那就是利用函數來模擬塊級做用域,如:數組
// code 1 (function(){ //這裏是塊級做用域 //做用:限制向全局做用域中添加過多的變量和函數,即避免內部臨時變量影響全局空間 })();
有些fresh meat ( like me, haha )可能會在使用for循環時忽略i是全局變量而致使循環沒法終止,直至頁面崩潰,以下場景函數
// code 2 var arr1 = [1, 2, 3, 4]; var arr2 = [1, 2]; for (var i = 0; i < arr1.length; i++){ blablabla... for (var i = 0; i < arr2.length; i++){ blablabla... } }
上面這段代碼中,someone可能認爲循環最多執行4*2=8次,實際上這裏會無限循環:每次內層循環執行完畢,i都等於2,從而致使外層循環的循環條件永遠爲true。究其緣由,在於內外層是在同一個做用域,內外層的i是同一個變量,而不是內層自成做用域。
如今ES6幫咱們解決這個問題了,使用let和大括號定義局部變量,上段代碼能夠改寫以下:學習
// code 3 var arr1 = [1, 2, 3, 4]; var arr2 = [1, 2]; for (var i = 0; i < arr1.length; i++){ blablabla... for (let i = 0; i < arr2.length; i++){ blablabla... } }
let聲明的局部變量帶來的一個附加改變是:沒法進行變量提高。在局部做用域內,使用let聲明變量以前,該變量都不可用。從局部做用域開始到局部變量聲明以前這段被稱爲暫時性死區TDZ,TDZ是針對某特定局部變量而言的。code
- const對象
js也有常量啦!這個不得不讓人感嘆js真的愈來愈像java了。const聲明的常量只在當前做用域有效。另外,對於複合類型的變量,如對象,const變量存儲的是地址,這時不可修改的是地址,但地址中存儲的內容是可變的。作用域
- 默認值
ES5中咱們是否是常常有這種寫法:字符串
// code 4 var polySay = function(name, age) { name = sayWhat || "Poly"; age = sayWhat || "forever 18"; console.log("My nane is " + name + "and I'm " + age); };
爲了兼容不傳參數的情形,咱們可能寫了N多相似以上的代碼。如今ES6給咱們提供了一項新功能:給變量設置默認值。在聲明變量時能夠設置一個默認值,以備使用時發現改變量沒有賦值。
上面代碼能夠改寫爲:io
// code 5 var polySay = function({name:"Poly", age: "forever 18"}) { console.log("My nane is " + name + "and I'm " + age); };
- 解構賦值
前面函數參數設置默認值中,你可能注意到設置默認值的方式有點陌生,這涉及到ES6爲咱們提供的另外一個新功能:解構賦值。解構賦值是指按照必定模式,從數組和對象中提取值爲變量進行賦值。好比:
// code 6 let [a, [b], c] = [1, [2, 3]]; // a被賦值爲1,b被賦值爲2 // c沒有解析到相應的解構,所以c被賦值爲udefined
又好比:
// code 7 let {name: who, age} = {name: "Poly", age: "forever 18"}; // who被賦值爲"Poly"
解構賦值主要針對數組和對象,順帶捎上字符串、數值和布爾值。由於字符串會被自動轉換爲字符數組,然後二者會被轉換爲對象。
// code 8 let [a, b, c] = "Hello"; // a被賦值爲「H」,b 被賦值爲「e」,c被賦值爲「l」 // 由於等號右側的"Hello"被自動轉化爲["H", "e", "l", "l", "o" ] let (toString:s) = 123; // 數值123被轉化爲對象,而Number對象有toString屬性 let (toString s) = true // 布爾值true被轉化爲對象,而Boolean對象有toString屬性
解構賦值的應用還包括:函數返回多個值、提取JSON數據。
// code 9 function polySay(){ return [1, 2, 3]; } // 不再用拼數組拼對象(是拼湊,不是拼爹) let [a, b, c] = polySay(); let json = { id: 111, name: "Poly", }; let {id, name} = json; //不再用一個個取
很好用,有木有,有木有?
to do
to do
to do
to do
to do
時間所限,剩下幾個部分沒有寫完,後續補上,頂鍋遁走。