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