上篇文章記錄了在開啟ES6之旅前需要使用的babel轉(zhuǎn)碼器的使用方法郑气,本篇文章正式開始ES6的語法學(xué)習(xí)。
1腰池、 Generator 函數(shù)
yield
表達(dá)式與return
語句既有相似之處尾组,也有區(qū)別。相似之處在于示弓,都能返回緊跟在語句后面的那個(gè)表達(dá)式的值讳侨。區(qū)別在于每次遇到yield
,函數(shù)暫停執(zhí)行奏属,下一次再從該位置繼續(xù)向后執(zhí)行跨跨,而return
語句不具備位置記憶的功能。一個(gè)函數(shù)里面囱皿,只能執(zhí)行一次(或者說一個(gè))return
語句勇婴,但是可以執(zhí)行多次(或者說多個(gè))yield
表達(dá)式。正常函數(shù)只能返回一個(gè)值铆帽,因?yàn)橹荒軋?zhí)行一次return
咆耿;Generator 函數(shù)可以返回一系列的值,因?yàn)榭梢杂腥我舛鄠€(gè)yield爹橱。從另一個(gè)角度看,也可以說 Generator 生成了一系列的值,這也就是它的名稱的來歷(英語中愧驱,generator 這個(gè)詞是“生成器”的意思)慰技。
next 方法的參數(shù)
首先說明一個(gè)容易混淆的地方:
- 運(yùn)行Generator 函數(shù)得到的結(jié)果是一個(gè)遍歷器對(duì)象而不是普通函數(shù)運(yùn)行的結(jié)果。當(dāng)我們執(zhí)行函數(shù)的
next()
方法時(shí)才會(huì)改變指針的指向去執(zhí)行函數(shù)內(nèi)的代碼组砚。 - 我們?cè)谡{(diào)用Generator 函數(shù)的
next()
方法時(shí)吻商,返回的是一個(gè)例如{ value: 18, done: false }
結(jié)果對(duì)象,value的值是由yield
表達(dá)式(緊挨著yield
后面的)計(jì)算得出的。如果表達(dá)式為2 * (yield (5 + 1));
,那么value的值為5+1=6
而不是2*6
糟红。具體看demo2艾帐。 - 而
yield
表達(dá)式本身的值卻是和執(zhí)行n+1
次next()
方法時(shí)傳入的參數(shù)相對(duì)應(yīng)。與yield
表達(dá)式無關(guān)盆偿,以2 * (yield (5 + 1))
表達(dá)式為例,如果next(5)
,yield
表達(dá)式的值就是5
,如果next()
表達(dá)式的值就是undefined
,具體看下面代碼柒爸。
yield
表達(dá)式本身沒有返回值,或者說總是返回undefined
事扭。next()
方法可以帶一個(gè)參數(shù)捎稚,該參數(shù)就會(huì)被當(dāng)作上一個(gè)yield
表達(dá)式的返回值。
demo1:
function* foo1(x){
let a= yield (10+x);
console.log("a:"+a); //a:a的值為===
let b= yield (10*x);
console.log("b:"+b); //b:b的值為===
}
var foo1 = foo1(8);
let aa = foo1.next();
console.log(aa); //{ value: 18, done: false }
let bb = foo1.next('a的值為===');
console.log(bb); //{ value: 80, done: false }
foo1.next('b的值為===');
demo2:
function* foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var a = foo(5);
a.next() // Object{value:6, done:false} ,下面有詳細(xì)的計(jì)算流程
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}
var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }
b.next(13) // { value:42, done:true }
上面代碼中求橄,第二次運(yùn)行next()
方法的時(shí)候不帶參數(shù)今野,導(dǎo)致y的值等于2 * undefined
(即NaN),除以3以后還是NaN
罐农,因此返回對(duì)象的value屬性也等于NaN
条霜。第三次運(yùn)行Next方()
法的時(shí)候不帶參數(shù),所以z等于undefined
涵亏,返回對(duì)象的value屬性等于5 + NaN + undefined
宰睡,即NaN
。
如果向next()
方法提供參數(shù)溯乒,返回結(jié)果就完全不一樣了夹厌。上面代碼第一次調(diào)用b的next()
方法時(shí),返回x+1
的值6
裆悄;第二次調(diào)用next()
方法矛纹,將上一次yield
表達(dá)式的值設(shè)為12
,因此y
等于24
光稼,返回y / 3
的值8
或南;第三次調(diào)用next()
方法,將上一次yield
表達(dá)式的值設(shè)為13
艾君,因此z
等于13
采够,這時(shí)x
等于5
,y
等于24
冰垄,所以return
語句的值等于42
蹬癌。
注意,由于
next方()
法的參數(shù)表示上一個(gè)yield
表達(dá)式的返回值,所以第一次使用next()
方法時(shí)逝薪,不能帶有參數(shù)隅要。V8 引擎直接忽略第一次使用next()
方法時(shí)的參數(shù),只有從第二次使用next()
方法開始董济,參數(shù)才是有效的步清。從語義上講,第一個(gè)next()
方法用來啟動(dòng)遍歷器對(duì)象虏肾,所以不用帶有參數(shù)廓啊。
2、Object.assign()
參考:http://www.cnblogs.com/tugenhua0707/p/7436685.html 感謝作者的總結(jié),受益匪淺!
- 2.1
3封豪、箭頭函數(shù)
http://www.reibang.com/p/69e0f28ff148.
4谴轮、 Promise對(duì)象
http://www.reibang.com/p/3a2ee303a18c
5、 async函數(shù)
參考文章: