ECMAScript6
也就是ECMAScript2015
变量声明let
letlet变量不可重复声明
let a = 1
let a = 2 // Duplicate declaration 块级作用域
// 在ES6之前,JS只有全局作用域和函数作用域
{
var a = 'a变量';
}
console.log(a); // 可以正常输出
// ES6加入了块级作用域,如果想声明一个只在块作用域中有效的变量,需要使用let关键字
{
let b = "变量b";
}
//console.log(b); // ReferenceError: b is not defined,let定义的变量的作用域位于块级作用域中不存在变量提升
常量声明 const
const值不能被修改的量称为常量
不可被修改
对数组和对象元素的修改,不算对常量的修改
const变量不可重复声明
在声明时就要被初始化
约定:常量一般使用大写
块级作用于
同let一致
Destructuring 变量解构赋值
数组解构
对象解构
函数解构参数
字符串 String
字符串包含
模板字符串
可有换行,会替换变量
带标签的模板字符串
对象
对象简化写法:属性赋值简化
对象简化写法:方法声明简化
对象属性值的赋值
Object对象
Object.is 判断值是否相同
Object.is 判断值是否相同这里包括了数据类型的判断,类似于 ===,但是===有些问题
Object.assign 属性复制
Object.assign 属性复制Object.setPrototypeOf 更改对象原型
Object.setPrototypeOf 更改对象原型函数
获取函数名称
箭头函数 Arrow Function
类似Java的lambda表达式
函数形参初始值
rest参数(可变参数)
Spread扩展运算符
Spread扩展运算符新数据类型:symbol
symbolsymbol代表独一无二的值。
函数Symbol()创建symbol
Symbol()创建symbol根据字符串创建symbol
symbolSymbol.for创建
Symbol.for创建不可与任何数据类型运算
使用场景:用作唯一方法/属性名
或者使用如下方式:
Symbol对象的内置值
Symbol对象的内置值Symbol对象有一些内置值,代表对象的一些内置方法,比如在调用obj instanceof Person时,会去调用类型内部的static [Symbol.hasInstance](param) {}方法去判断对象是否属于某一类型。
我们可以通过Symbol的内置值,对类型的一些功能进行重写。
参考:Symbol - JavaScript | MDN (mozilla.org)
Symbol.hasInstance 控制类型检测
Symbol.hasInstance 控制类型检测instanceof对象类型判断重写:
Symbol.isConcatSpreadable是否可以被展开
Symbol.isConcatSpreadable是否可以被展开迭代器
迭代器是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作。下面是原生带有Iterator接口的数据:
ArrayArgumentsSetMapStringTypedArrayNodeList
Iterator接口
for of循环
自定义类型支持Iterator
生成器
声明和调用
参数传递
yield关键字可以接收next的返回值,yield将会在next方法调用之前阻塞。
上面代码的输出结果为:
实例:解决回调地狱
实例2:实际场景模拟
假设有如下场景,需要
获取当前登录用户信息
根据用户id查询订单列表
取出订单列表第一条订单购买的第一个商品id,并请求查询商品详情
响应结果:
await和sync
await和syncawait是生成器的语法糖:
上面的代码与下面是等价的:
Promise
Promise是JS中进行异步编程的新解决方案,Promise可以封装一个异步操作,并获取成功/失败的结果值。通过Promise构造函数,创建一个Promise:
Promise中含有两个重要的属性,PromiseState和PromiseResult。当Promise执行异步任务时
如果经过一段时间异步任务执行成功,需要异步任务调用
resolve(value),此时PromiseState将会从pending变为resolvedPromiseResult的值为value,一般是成功的值
如果经过一段时间异步任务执行失败,需要异步任务调用
reject(err)或者直接抛出异常throw err,此时PromiseState将会从pending变为rejectedPromiseResult的值为err,一般是失败的原因
此外,promise还提供了then以及catch方法,当状态发生变化时,会调用then传入的回调:
then方法的调用需要传入两个回调函数(可以只传一个回调函数)
有些异步任务仅仅需要处理失败的情况,Promise也提供了catch方法,单独用作失败回调
可以指定多个then,这些then指定的回调都会被执行:
then方法返回的promise对象是由如下三种情况决定的
如果then的函数参数在处理中抛出异常,then返回状态为resolved的新的promise
如果then的函数参数返回的值是非promise的任意值,那么then返回状态为resolved的新promise对象
如果then的函数参数返回的值是一个新的promise对象,那么then返回这个新的promise对象(这种方式可以通过链式调用完成嵌套操作)
实例:文件读取
实例:封装AJAX
Set
Map
面向对象
ES6 的面向对象就是 ES5 的语法糖,这些功能都可以在 ES5 中实现。
class
继承
封装
模块化
在ES5的时候,第三方提供的模块化规范有:
CommonJS
NodeJS,Browserify
AMD
requireJS
CMD
seaJS
export和import
export和import创建模块m1.js:
创建模块m2.js,并引用m1导出的方法和变量:
统一暴露
默认暴露
通用别名导入方式
解构赋值形式
结构部分别名
导入默认暴露的模块
导入的简便模式:针对默认暴露
最后更新于
这有帮助吗?