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

最新文章

  1. 使用 trash-cli 逃出 rm 命令误删除重要文件的阴影
  2. 浏览器中跨域创建cookie的问题
  3. Quartus II中FPGA的管脚分配保存方法
  4. 入門必學NO.1 Android 初學特訓班(第四版) 目錄
  5. NSURLSession使用实战教程
  6. HDU 2846 Repository(字典树,标记)
  7. webservice使用基本技巧
  8. 从零基础入门JavaScript(2)
  9. DW8051调试终结
  10. 创建naarray(1)
  11. Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError
  12. JAVAWEB复习资料-01
  13. g4e基础篇#1 什么是版本控制系统
  14. kafka安装教程
  15. RabbitMQ集群出现过机器故障,网络异常等故障后,重启无法重新建立集群的终极解决方案
  16. 八、文件IO——存储映射
  17. UVALive 4850 Installations 贪心
  18. ASP.net MVC模式介绍(一)
  19. spring cloud: 关闭ribbon负载均衡
  20. 怎么从bam文件中提取出比对OR没比对上的paired reads | bamToFastq | STAR

热门文章

  1. [.net core] 12.环境变量
  2. oracle中的表空间以及和表空间有关的操作
  3. SpringBoot项目中遇到的BUG
  4. 2019-11-29-dotnet-获取指定进程的输入命令行
  5. AIX系统的备份和恢复
  6. php字符串大小写转换
  7. Codeforces 911 三循环数覆盖问题 逆序对数结论题 栈操作模拟
  8. nginx代理证书使用方法
  9. 【BZOJ1999】树网的核
  10. Python修炼之路-异常