ECMAScript6

也就是ECMAScript2015

变量声明let

let变量不可重复声明

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变量不可重复声明

在声明时就要被初始化

约定:常量一般使用大写

块级作用于

同let一致

Destructuring 变量解构赋值

数组解构

对象解构

函数解构参数

字符串 String

字符串包含

模板字符串

可有换行,会替换变量

带标签的模板字符串

对象

对象简化写法:属性赋值简化

对象简化写法:方法声明简化

对象属性值的赋值

Object对象

Object.is 判断值是否相同

这里包括了数据类型的判断,类似于 ===,但是===有些问题

Object.assign 属性复制

Object.setPrototypeOf 更改对象原型

函数

获取函数名称

箭头函数 Arrow Function

类似Java的lambda表达式

函数形参初始值

rest参数(可变参数)

Spread扩展运算符

新数据类型:symbol

symbol代表独一无二的值。

函数Symbol()创建symbol

根据字符串创建symbol

Symbol.for创建

不可与任何数据类型运算

使用场景:用作唯一方法/属性名

或者使用如下方式:

Symbol对象的内置值

Symbol对象有一些内置值,代表对象的一些内置方法,比如在调用obj instanceof Person时,会去调用类型内部的static [Symbol.hasInstance](param) {}方法去判断对象是否属于某一类型。

我们可以通过Symbol的内置值,对类型的一些功能进行重写。

参考:Symbol - JavaScript | MDN (mozilla.org)

Symbol.hasInstance 控制类型检测

instanceof对象类型判断重写:

Symbol.isConcatSpreadable是否可以被展开

迭代器

迭代器是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作。下面是原生带有Iterator接口的数据:

  • Array

  • Arguments

  • Set

  • Map

  • String

  • TypedArray

  • NodeList

Iterator接口

for of循环

自定义类型支持Iterator

生成器

声明和调用

参数传递

yield关键字可以接收next的返回值,yield将会在next方法调用之前阻塞。

上面代码的输出结果为:

实例:解决回调地狱

实例2:实际场景模拟

假设有如下场景,需要

  1. 获取当前登录用户信息

  2. 根据用户id查询订单列表

  3. 取出订单列表第一条订单购买的第一个商品id,并请求查询商品详情

响应结果:

awaitsync

await是生成器的语法糖:

上面的代码与下面是等价的:

Promise

Promise是JS中进行异步编程的新解决方案,Promise可以封装一个异步操作,并获取成功/失败的结果值。通过Promise构造函数,创建一个Promise:

Promise中含有两个重要的属性,PromiseStatePromiseResult。当Promise执行异步任务时

  • 如果经过一段时间异步任务执行成功,需要异步任务调用resolve(value),此时

    • PromiseState将会从pending变为resolved

    • PromiseResult的值为value,一般是成功的值

  • 如果经过一段时间异步任务执行失败,需要异步任务调用reject(err)或者直接抛出异常throw err,此时

    • PromiseState将会从pending变为rejected

    • PromiseResult的值为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

NodeJSBrowserify

AMD

requireJS

CMD

seaJS

exportimport

创建模块m1.js

创建模块m2.js,并引用m1导出的方法和变量:

统一暴露

默认暴露

通用别名导入方式

解构赋值形式

结构部分别名

导入默认暴露的模块

导入的简便模式:针对默认暴露

最后更新于

这有帮助吗?