詳解ES6


首先,還是介紹一下ES6,ES6全稱為ECMAScript,由於目前的ES6是2015年發布的,所以又稱為ECMAScript 2015.在越來越多程序員開始使用ES6在自己的項目中的今天,即使ES6的兼容性還有待提高,我們也要對其了解

本文主要從let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments幾個特性來介紹ES6

1.const

大家都知道,js中聲明變量用var,事實上,js並不存在常量之說,當然也並非不可實現,比如借用對象來創建一個不可變屬性的對象來近似偽造常量,當取對象時,覆蓋屬性值來實現,然而,這到底顯得多余又復雜。

ES6用const解決了這種情況,其使用方法

const a =1; 

const聲明一個常量;並且不可覆蓋

2.let

js中還有個問題,也總是讓人覺得惱火,就是作用域問題,首先我們都知道一個函數為一個作用域,在函數體內定義的變量,在整個函數中生效,並不在函數外生效。但if語句,for循環內的變量不存在作用域問題,存在於上下文,尤其當函數聲明提升和變量提升加作用域遇到一起的時候,要注意的問題還是很多的,舉個例子

up();
var foo = 1;
var bar = 2;
function  up(){
 console.log("foo is",foo);
    if(foo == 1) {
        var x = 5;
    }
    if(bar == 2) {
        console.log(x);
    }
   var foo = 'bar';
 console.log("foo is",foo);
}
console.log("foo is",foo);

此例中需要考慮的問題很多,每個console值都不同,這無疑對我們開發造成了一定的麻煩,稍有不注意。就不知從何改起

因此,ES6新增了let,let為塊級作用域。也就是說,一個判斷語句均為一個塊級作用域,在此之外在引用此let,會報錯

其使用方法: let x=2;

舉例:

function chunk() {
    if(foo) {
        let x = 5;
    }
    if(bar) {
        console.log(x); //error
    }
}

3.class,extends,super

ES5中有幾個令人頭疼的屬性,事實上,js實際上並沒有“類“的說法,由於過於不方便,我們用原型,原型鏈的形式添加了類似可以實現繼承的方法。實際上這種寫法由於和大多數后端語言java c#等編程語言相差甚遠並且語法復雜,this指向混亂,這讓很多習慣寫后端語言的大神們並不習慣,終於在ES6里提供了更接近傳統語言的寫入引用了CLASS。

class Parents {
    constructor(){
        this.type = 'parents'
    }
    says(say){
        console.log(this.type + ' says ' + say)
    }
}

let parent = new Parents ()
parent .says('hello') //parent says hello

class Kid extends Parents {
    constructor(){
        super()
        this.type = 'kid'
    }
}

let kid = new Kid()

從上面的代碼可以看出這種“類”的形式已經很接近傳統意義了。首先定義一個類名為Parent的類,constructor(){}為構造方法,在構造方法內定義的方法與屬性都是實例本身的,而constructor外的方法與屬性是大家共享的。

兩個類之間可以用extends來實現繼承,通過extends來繼承可以直接繼承其要繼承的類中(Parents)所有屬性和方法。

supper();指父類的實例,在新建實例時子類必須在constructor(){}中調用super();由於子類沒有自己的this對象,只能通過繼承父類的this來進行操作,如若不調用super(),則子類無this對象。

4.箭頭函數(arrow functions)  =>

所謂箭頭函數的形式為“=>”

原來寫函數:

function a(){
  a=a++;
}

現在寫函數

a()=>{a=a++}

此外。箭頭函數還有一個非常大的作用,就是this指向問題,大家可能都遇見過一個函數內,定時器的this是指向全局的,不是函數本身,要解決這個問題我們需要把this賦給一個變量,再用變量指代this 或是將定時器的函數綁定this方可,如果用的是=>就不會有這種問題出現。箭頭函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象。

5.字符串模版(template string)

ES6出現之前我們如果想用類似於jquery的框架把html模版添加到頁面中是要用一堆++來連接的,這樣不僅麻煩,而且非常容易造成xss攻擊

之前

$("#div").append(
  "a:" + a + "</br> " +
  "b, " +
  "<em>" + c +
  "</em>d!"
);

 

ES6給了我們一種新的寫法

$("#div").append(`
a:${a}</br>
b<em>$(c)</em>d!
`)

用反引號`來標識起始,用$()來引用變量

6.default、rest

在ES6中如果想給一個函數,當函數沒傳參或忘記傳參時給其一個默認值

function aa(type = 'aa'){
  type=type+"是個默認值"
console.log(type)
}

rest的用法:

function aa(...types){
  console.log(types)
}

aa('a','b','c','d')

此例中傳入多個參數,內容以循環的形式輸出,並且輸出結果為數組

本文參考地址:http://www.jianshu.com/p/ebfeb687eb70 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM