简单的说,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)); // ["第一条", "第二条"]