ECMAScript 6-11
ES6新特性
1.let关键字
let关键字用来声明变量,使用let声明的变量有几个特点:
- 不允许重复声明
- 块儿级作用域
- 不存在变量提升
- 不影响作用域链
- 应用场景:以后声明变量使用 let 就对了
2.const关键字
const 关键字用来声明常量,const 声明有以下特点:
-
声明必须赋初始值
-
标识符一般为大写
-
不允许重复声明
-
值不允许修改
-
块儿级作用域
注意: 对象属性修改和数组元素变化不会发出 const 错误 应用场景:声明对象类型使用 const,非对象类型声明选择 let
3.变量的解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。
1)数组的解构:
2)对象的解构
注意:频繁使用对象方法、数组元素,就可以使用解构赋值形式
4.模板字符串
模板字符串(template string)是增强版的字符串,用反引号(`)标识,特点:
- 字符串中可以出现换行符
- 可以使用 ${xxx} 形式输出变量
5.箭头函数
ES6允许使用【箭头】 (=>)定义函数
- this直接调用的话,是指向window的
- 箭头函数 this是静态的,this始终指向函数声明时所在作用域下的this的值
- 箭头函数不能作为构造实例化对象
- 箭头函数的简写(省略小括号,当形参有且只有一个的时候)(省略花括号,当代码体只有一条语句的时候)
6.rest参数
ES6 引入 rest 参数, 用于获取函数的实参,用来代替arguments
7.spread扩展运算符
...
扩展运算符能将数组转换为逗号分隔的参数序列
8.扩展运算符的应用
- 数组的合并
-
数组的克隆
-
将伪数组转为真正的数组
9.Symbol
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。
Symbol 特点
- Symbol的值是唯一的,用来解决命名冲突的问题
- Symbol的值不能与其他数据进行运算
- Symbol定义的对象属性不能使用for…in 循环遍历,但是可以使用Reflect.ownkeys来获取对象的所有键名
10 .Symbol内置属性
11.迭代器
for…in 遍历的是键名
使用 for… of 遍历的是键值
工作原理
- 创建一个指针对象,指向当前数据结构的起始位置
- 第一次调用对象的next()方法,指针自动指向数据结构的第一个成员
- 接下来不断调用next()方法,指针一直往后移动,直到指向最后一个成员
- 每调用next()方法,返回一个包含value和down属性的对象
- 注意(需要自定义遍历数据的时候,要想到迭代器)
12.生成器
生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同
13.Promise
Promise是ES6引入的异步编程的新解决方案。
语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或者失败的结果。
-
Promise构造函数:Promise(excutor) {}
-
Promise.prototype.then 方法
-
Promise.prototype.catch 方法
-
Promise封装AJAX操作
成功拿到数据 -
调用then 方法 then 方法的返回结果是promise对象, 对象状态由回调函数的执行结果决定
-
如果回调函数中返回的结果是非promise 类型的属性,状态为成功, 返回值为对象的成功的值
14.Set
ES6提供了新的数据结构 Set(集合).她类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用【扩展运算符】和【for…of…】进行遍历,集合的属性和方法:
- size 返回集合的元素个数
- add 增加一个新元素,返回当前集合
- delete 删除元素,返回boolean值
- has 检测集合中是否包含某个元素,返回boolean值
- 数组去重
- 交集
- 并集
- 差集
15.class 类
ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过Class关键字,可以定义类。基本上,ES6的Class可以看做只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面对对象编程的语法而已。
16.数值扩展
-
Number.EPSILON是JavaScript表示的最小精度(EPSILON属性的值接近于 2.2204460492503130808472633361816E-16)
-
二进制和八进制
-
Number.isFinite 检测一个数值是否为有限数
-
Number.isNaN 检测一个数值是否为NaN
-
Number.parseInt、Number.parseFloat字符串转整数
-
Number.isInteger 判断一个数是否为整数
-
Math.trunc 将数字的小数部分抹掉
-
Math.sign 判断一个数到底为正数 负数 还是零
17.对象方法扩展
- Object.is 判断两个值是否相等
- Object.assign 对象的合并
- Object.setPrototypeOf、Object.getPrototypeOf 设置原型对象
18.ES6模块化
模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。
模块化的优势有以下几点:
- 防止命名冲突
- 代码复用
- 高维护性
ES6之前的模块化规范有:
- CommonJS => NodeJS、Browserify
- AMD => requireJS
- CMD => seaJS
18.1 ES6模块化语法
模块功能主要由两个命令构成: export和import
- export命令用于规定模块的对外接口
- import命令用于输入其他模块提供的功能
19 ECMAScript 7 新特性
19.1 Array.prototype.includes
includes 方法用来检测数组中是否包含某个元素,返回布尔类型值
19.2 指数操作符
在ES7中引入指数运算符 【**】,用来实现幂运算,功能与Math.pow结果相同
20 ECMAScript 8 新特性
20.1 async 和 await
async 和 await 两种语法结合可以让异步代码像同步代码一样
20.2 async 函数
- async函数的返回值为promise对象
- promise对象的结果由async函数执行的返回值决定
20.3 await 表达式
- await 必须写在async函数中
- await 右侧的表达式一般为promise对象
- await 返回的是promise成功的值
- await的promise失败了,就会抛出异常,需要通过try…catch捕获处理
20.4 Object.values 和 Object.entries
- Object.values()方法返回一个给定对象的所有可枚举属性值的数组
- Object.entries方法返回一个给定对象自身可遍历属性[key, value]的数组
20.5Object.getOwnPropertyDescriptors
该方法返回指定对象所有自身属性的描述对象
21 ECMAScript 9 rest参数
rest 参数与spread扩展运算符在ES6中已经引入, 不过ES6中只
针对于数组, 在ES9中为对象提供了像数组一样的rest参数和扩展运算符