簡單的說,Symbol就是一個絕對惟一的key值,相似以前obj['key']='value'這種操做的字符串'key',好處是絕對不會重複,避免覆蓋以前的值。promise
Symbol是一個方法,會返回一個惟一的symbol,能夠帶參數,好比:var sy=Symbol('sy-name'),不過這只是爲了方便查看,加不加目前沒有區別。函數
var sy1=Symbol(),sy2=Symbol(); console.log(sy1===sy2);//false var obj={[sy1]:'這是數據一'}; obj[sy2]='這是數據二'; console.log(obj);//{Symbol(): "這是數據一", Symbol(): "這是數據二"}
var sy1 = Symbol.for(),sy2 = Symbol.for(); console.log(sy1 === sy2);//true var sy3 = Symbol.for('info1'),sy4 = Symbol.for('info1'); console.log(sy3 === sy4);//true var sy5=Symbol('info2'),sy6 = Symbol.for('info2'); console.log(sy3 === sy6);//false console.log(sy5 === sy6);//false
該方法是配合上面的方法來使用的,接受一個Symbol做爲參數,會在全局搜索該Symbol對象,返回該對象名稱,若是沒有就返回undefined。指針
定義函數名稱時帶一個*的函數就是Generator函數,內部的yield語句是特點,該函數的使用能夠用下面的幾條歸納一下:code
function *firstYieldFun(){ yield '你好'; yield '2007'; return 'name:'; } var fun=firstYieldFun(); console.log(fun.next());//{value: "你好", done: false} console.log(fun.next());//{value: "2007", done: false} console.log(fun.next());//{value: "name:", done: true} console.log(fun.next());//{value: undefined, done: true} console.log(fun.next());//{value: undefined, done: true}
簡單的說,Generator函數就是一個分段執行的函數,走走停停,yield用來切割代碼成一段段的,next()方法用來啓動執行下一段這個行爲。對象
forEach方法的參數是一個普通函數,Generator函數不能夠做爲參數。事件
除了上面的例子yield單獨成爲一個語句,其還能夠用於表達式,函數參數和賦值表達式的右邊等。字符串
須要注意的是,yield要明確歸屬,用小括號包裹,小括號不是必須的,是在歸屬關係不明確的時候纔是必須的,例如:console.log('My name is : '+(yield '你好2007'))
;io
yield自己不會返回值,或者說是undefined,不過next()方法若是帶參數狀況就不同了,此時就會返回yield帶的參數,以下例子說明:console
function* secondYieldFun() { console.log(yield '你好2007'); } var fun = secondYieldFun(); console.log(fun.next()); //{value: "你好2007", done: false} //這是參數 console.log(fun.next('這是參數')); //{value: undefined, done: true}
Promise就是一個對象,有點相似註冊事件的感受,不過又不同,你提早註冊好成功和失敗之後應該走的路徑,而後你本身根據實際狀況決定是失敗仍是成功,其實和回調沒有本質的區別,就是寫起來好像好看了些,下面的例子很明瞭。function
var promise1 = new Promise(function(resolve, reject) { setTimeout(function() { if (false) { //Pending --> Resolved resolve('成功了'); } else { //Pending --> Rejected reject('失敗了'); } }, 5000); }); promise1.then(function(value) { console.log('成功:' + value); }, function(error) { console.log('失敗:' + error); });
須要說明一下的是,Promise對象保證着三種狀態:pending、Resolved和Rejected,就是進行中、成功和失敗的意思。
將多個Promise實例,包裝成一個新的Promise實例。 下面介紹的二個方法的參數若是不是對象的實例,就會先調用Promise.resolve方法變成對象的實例再傳遞進去。
let pro=Promise.race(Promise對象的實例1, Promise對象的實例2 [,Promise對象的實例N])
只要promise對象的實例中有一個率先改變,率先改變的那個的返回狀態就會做爲pro的狀態返回,餘下的會繼續執行完畢但不會改變狀態了。
let pro=Promise.all(Promise對象的實例1, Promise對象的實例2 [,Promise對象的實例N])
結果只有二種狀況:
var pro1 = new Promise((resolve, reject) => setTimeout(() => resolve('第一條'), 3000)); var pro2 = new Promise((resolve, reject) => setTimeout(() => resolve('第二條'), 1000)); var proAll = Promise.all([pro1, pro2]); proAll.then(val => console.log(val)); // ["第一條", "第二條"]