ES6注

1、Promise构造函数

//resolve(成功),reject(失败)两个参数
function runAsync(){
  var p = new Promise(function(resolve,reject){
    //做一些异步操作
    setTimeout(function(){
      console.log('执行完成');
      resolve('执行完成数据');
    });
  });  
  return p;
}
runAsync();

then、catch

//链式操作
runAsync()
  .then(function(data){
    console.log(data);
    return runAsync2();
  })
  .then(function(data){
    console.log(data);
  })
//then-catch
runAsync()
  .then(function(data){
    console.log('resolved-'+data);
  })
  .catch(function(reason){
    console.log('rejected-'+reason);
  });

all的用法:并行执行,所有异步操作执行完才执行回调

runAsync()
  .all([runAsync1(), runAsync2(), runAsync3()])
  .then(function(results){
    console.log(results);
  });

race的用法:先执行完一个异步操作就执行回调

runAsync()
  .race([runAsync1(), runAsync2(), runAsync3()])
  .then(function(results){
    console.log(results);
  });

 2、三点运算符(...):浅拷贝

对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。

let obj2 = {...obj1}; //浅拷贝,修改obj2会同步修改obj1

注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

const [...rest, last] = [1, 2, 3, 4, 5];
// 报错
const [first, ...rest, last] = [1, 2, 3, 4, 5];
// 报错

扩展运算符还可以将字符串转为真正的数组

[...'hello']
// [ "h", "e", "l", "l", "o" ]

 3、symbol

应用场景1:可以更好的设计我们的数据对象,我们可以把不需要对外操作和访问的属性用symbol来定义。

let obj = {
   [Symbol('name')]: '一斤代码',
   age: 18,
   title: 'Engineer'
}

Object.keys(obj)   // ['age', 'title']

for (let p in obj) {
   console.log(p)   // 分别会输出:'age' 和 'title'
}

Object.getOwnPropertyNames(obj)   // ['age', 'title']
JSON.stringify(obj); //{'age': 18, 'title': 'Engineer'}

会有一些针对symbol的API:

// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]
// 使用新增的反射API Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']

应用场景2:使用symbol来代替常量

const TYPE_AUDIO = Symbol();
const TYPE_VIDEO = Symbol();
console.log(TYPE_AUDIO===TYPE_VIDEO); //false,Symbol()是唯一的

应用场景3:使用symbol来定义类的私有属性/方法

const PASSWORD = Symbol();
class Login {
  constructor(username, password){
    this.username = username;
    this[PASSWORD] = password;
  }
  checkPassword(pwd){
    return this[PASSWORD] === pwd;
  }
}

 注册和获取全局Symbol

let gs1 = Symbol.for('global_symbol_1'); //注册一个全局Symbol
let gs2 = Symbol.for('global_symbol_1'); //获取全局Symbol
gs1===gs2; //true

 

posted @ 2019-07-16 13:51  shirliey  阅读(186)  评论(0编辑  收藏  举报