首先,還是介紹一下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