Skip to main content

概览

ECMAScript 通常被看作是 JavaScript 的标准规范,但实际上 JavaScript 是 ECMAScript 的扩展语言。

ECMAScript 只提供了最基本的语法,停留在语言层面。而 JavaScript 实现了 ECMAScript 的语法,并扩展实现了适合平台运行的语法。

ES2015 新增特性可分为 4 类:

  • 解决原有语法上的一些问题或者不足

  • 对原有语法进行增强

  • 全新的对象、全新的方法、全新的功能

  • 全新的数据类型和数据结构

    1. let 与块级作用域,解决 var 存在的问题,新增块级作用域(原来只有全局作用域和函数作用域)

    2. const,let 的基础上增加了只读的功能。最佳实践:不用 var,主用 const,配合 let

    3. 解构,rest 运算符...,设置默认值

      数组解构,根据索引获取值

      对象解构,根据属性名获取值

    4. 模板字符串

      模板字符串的标签函数

      function tagFun(strings, ...args) {
        console.log(strings); // strings 是个数组,使用${}分割的数组
        console.log(args); // 接收${}中变量的值
      }
      const name = "jack";
      const gender = true;
      
      const result = tagFun`hey, ${name} is a ${gender}`;
      
    5. Object.assign,实际上是一个浅拷贝。

      第一个参数是targetObj,返回合并后的targetObj,原来的targetObj就被修改了。

      let o1 = { a: 1, b: { c: 2 } };
      let o2 = Object.assign({}, o1);
      
      o1.b.c = 3;
      console.log(o2.b.c); // 3
      
    6. Proxy,为对象的操作设置一层代理

      Proxy 比 defineProperty 支持更多的代理操作,如 delete、in、调用一个函数等

      Proxy 还支持对数组的操作进行代理

      非侵入式地对对象进行了监管

    7. Reflect 静态类,内部封装了一系列对对象的底层操作。

      主要意义在于统一提供了一套操作对象的 API。因为之前可能使用 Object 上的一些方法,也会使用delete,in等操作符。

    8. Set, 类似数组,但成员不允许重复

      可以用来给数组去重。可以通过 Array.from 或者扩展运算符转化为数组

    9. Map,键值对集合,且键可以是任意数据类型。

      传统对象的键只能是字符串,如果设置其他类型的数据作为键,最后都会被转化为字符串存储,例如对象作为键时,会被转化为'[object Object]'

    10. Symbol,表示一个独一无二的值。

      主要作用是为对象添加一个独一无二的属性名。用Symbol做属性名时,只能用[]的方式赋值或取值。

    11. for...of,作为遍历所有数据结构的统一方式

      数组,伪数组,Set,Map都可以遍历。但普通的object对象不能被遍历。

      实现iterable接口是使用for...of的前提,其内部就是调用这个iterable接口实现迭代。

      iterable接口实际上是迭代器模式的应用。迭代器模式的核心就是对外提供统一遍历接口

    12. Generator函数,理解async/await的基础,再结合Promise。

      generator函数可中断,可继续。