ES6學習之一

週末兩天學習了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

時間所限,剩下幾個部分沒有寫完,後續補上,頂鍋遁走。

相關文章
相關標籤/搜索