ECMAScript 规范
规范提案流程
- stage 0 : Strawman(展示阶段)
- stage 1 : Proposal(征求意见阶段)
- stage 2 : Draft(草案阶段)
- stage 3 : Candidate(候选人阶段)
- stage 4 : Finished(定案阶段)
'use strict'
意义
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 变量必须声明后使用,只读属性禁止覆盖
- 禁止
delete变量或不可删除的属性 - 阻止扩展的对象动态添加属性时抛出异常
- 禁用
with语句 - 限制
eval的作用域 - 削弱
arguments参数对象 this若无指定默认为undefined- 函数形参禁止同名
- 不建议使用语句内的函数声明
- 保留更多的关键字:
implements, interface, let, package, private, protected, public, static, yield, class, enum, export, extends, import, super
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的
Javascript做好铺垫。
如何使用
- 文件首行:影响整个文件
- 代码区块首行:影响整个代码块
- 函数首行:影响整个函数
- 其余位置无效
ES6规范主要内容
新增基础类型Symbol、bigInt
Symbol:独一无二的值,使用Symbol()创建bigInt:表示大于2^53 - 1的整数,可使用BigInt()创建
新增声明变量关键字 let 和 const
声明变量的6种方式
varletconstfunctionimportclass
var let const 的区别
- 声明过程的不一样
- 遇到有
var的作用域,在任何语句执行前都已经完成了声明和初始化 let和const先完成声明,并没有到初始化,提前访问会报错(暂时性死区)
- 遇到有
letconst不允许重复声明,var可以。letconst在作用域之外不可使用,var可以。块级作用域const不允许修改,若是引用类型表示不允许修改这个指向。
解构赋值
如何使用:
- “模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值
- 解构赋值允许指定默认值:
let [foo = true] = []; - 可嵌套解构
常用用途:
- 交换变量的值
- 提取
JSON对象中的数据 - 从函数返回多个值,通过解构获得
- 函数参数的定义
- 函数参数的默认值
- 遍历
Map结构 - 输入模块的指定方法
字符串扩展
- 新增遍历器接口,可被
for...of循环遍历 - 新增实用方法:
includes():是否包含某个字符串startsWith():是否以某个字符串开头endsWith():是否以某个字符串结尾
- 模板字符串:
- 所有的空格和缩进都会被保留在输出之中
- 可以使用
trim方法消除空格和换行 - 嵌入变量,需要将变量名写在
${} - 可嵌套
数值扩展
Math对象新增大量的数值相关计算方法,需要使用时查阅
函数扩展
- 参数可设置默认值
- rest参数(形式为
...变量名):可通过扩展运算符获取剩余参数,只能设置在参数最后一位 - 箭头函数
数组扩展
- 扩展运算符
...:rest参数的逆运算,将数组解构为用逗号分割的参数数列 - 新增实用方法:
Array.from():将类数组转换为数组find():查找成员并返回findIndex():查找成员下标并返回entries(),keys()和values():返回键值对、键、值对应的遍历器对象includes():返回成员是否包含对应值的布尔值flat():拍平数组
对象的扩展
- 扩展运算符
...:rest参数的逆运算,将对象解构为用逗号分割的参数数列 - 允许写入变量和函数,作为对象的属性和方法
- 新增实用方法:
entries(),keys()和values():返回键值对、键、值对应的遍历器对象Object.assign:合并对象,浅复制
新数据结构 Set、Map
Set:
- 类似于数组,但是成员的值都是唯一的,没有重复的值
- 可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化
- 内部判断两个值是否相等的方式类似===,主要的区别是NaN等于自身,两个对象总是不相等的
Set实例的属性和方法:
属性
Set.prototype.constructor:构造函数,默认就是Set函数。Set.prototype.size:返回Set实例的成员总数。
操作方法
add(value):添加某个值,返回Set结构本身。delete(value):删除某个值,返回一个布尔值,表示删除是否成功。has(value):返回一个布尔值,表示该值是否为Set的成员。clear():清除所有成员,没有返回值。
遍历方法
keys():返回键名的遍历器values():返回键值的遍历器entries():返回键值对的遍历器forEach():使用回调函数遍历每个成员
遍历的应用
- 可用扩展运算符...
- 数组去重:
[...new Set([1,1,2,3])] - 间接使用数组方法:
new Set([...set].map(x=>x+1))- 并集:
let union = new Set([...a, ...b]) - 交集:
let intersect = new Set([...a].filter(x => b.has(x))) - 差集:
let difference = new Set([...a].filter(x => !b.has(x)))
- 并集:
Map:
- 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
- 接受数组作为参数
- 只有对同一个对象的引用,
Map结构才将其视为同一个键 - 如果
Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键
Map实例的属性和方法
Map.prototype.size:返回Map结构的成员总数。
操作方法
set(key, value):设置键名key对应的键值为value,然后返回整个Map结构get(key):读取key对应的键值,如果找不到key,返回undefinedhas(key):返回一个布尔值,表示某个键是否在当前Map对象之中delete(key):删除某个键,返回true。如果删除失败,返回falseclear():清除所有成员,没有返回值
遍历方法
keys():返回键名的遍历器。values():返回键值的遍历器。entries():返回所有成员的遍历器。forEach():遍历Map的所有成员。
WeakSet: 类似Set。
- 区别1:成员只能是对象;
- 区别2:成员弱引用,无引用时可能会被回收
WeakMap: 类似Map。
- 区别1:只接受对象作为键名(
null除外); - 区别2:键名所指向的对象,不计入垃圾回收机制
Proxy 和 Reflect
Proxy:实现代理目标对象,可拦截操作方法,修改默认操作行为Reflect:将对象的操作方法放到该对象上,与Proxy代理的操作方法一一对应,方便完成默认行为
Promise对象
生成一个微任务,内部维护一个状态,一旦更新就不会再变,可以用来进行链式的异步操作
实用方法:
resolve参数:将状态从pending变为resolvereject参数:将状态从pending变为rejectPromise.prototype.then():Promise 实例添加状态改变时的回调函数。Promise.prototype.catch():.then(null, rejection)的别名,用于指定发生错误时的回调函数Promise.prototype.finally():不管 Promise 对象最后状态如何,都会执行的操作。Promise.all():将多个 Promise 实例,包装成一个新的 Promise 实例
Generator函数
生成一个遍历器对象返回,通过一次次调用返回对象的next方法完成对函数的运行,每一次next都会调用函数往下执行,直至下一个yield表达式
async函数
Generator函数的语法糖,并内置了执行器,会像普通函数一样同步执行,并返回一个Promise对象,在函数中可使用await表示等待后续函数的执行结果。如果await跟的是普通函数,会被Promise.resolve处理。
class类和继承
ES5构造函数的语法糖,继承的实现方式是寄生组合继承
ES module模块规范
规范了模块的导入导出语法
