一、ES6弥补了ES5的缺点

ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。

作为ECMAScript 标准十余年来变动最大的一个版本,ES6添加了许多新的语法特性。

1.ES6新增块级作用域

在块级作用域内声明的变量不会被外层所引用,也就是说不需要ES5通过(函数)闭包来解决全局变量污染的问题。

 

ECMAScript 6 (ES6) 新特性可以分为新增语法(例如:class),增强 JavaScript 功能(例如:import),以及改良 JS “缺陷” (例如:let关键字)。

2.ES6新增JS关键字

ES6新增加了两个重要的 JavaScript 关键字: let 和 const。

let 声明的变量只在 let 命令所在的代码块内有效。

const 声明一个只读的常量,一旦声明,常量的值就不能改变。

Reflect

ES6 中将 Object 的一些明显属于语言内部的方法移植到了 Reflect 对象上(当前某些方法会同时存在于 Object 和 Reflect 对象上),未来的新方法会只部署在 Reflect 对象上。

Reflect 对象对某些方法的返回结果进行了修改,使其更合理。

Reflect 对象使用函数的方式实现了 Object 的命令式操作。

 

拓展的方法

子串的识别

ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。

  • includes():返回布尔值,判断是否找到参数字符串。
  • startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。

以上三个方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引。

注意点:

  • 这三个方法只返回布尔值,如果需要知道子串的位置,还是得用 indexOf 和 lastIndexOf 。
  • 这三个方法如果传入了正则表达式而不是字符串,会抛出错误。而 indexOf 和 lastIndexOf 这两个方法,它们会将正则表达式转换为字符串并搜索它。

数值的表示

二进制表示法新写法: 前缀 0b 或 0B 。

Math 对象的扩展

ES6 在 Math 对象上新增了 17 个数学相关的静态方法,这些方法只能在 Math 中调用。

普通计算

Math.cbrt

用于计算一个数的立方根。

Math.imul

两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。

Math.hypot

用于计算所有参数的平方和的平方根。

Math.clz32

用于返回数字的32 位无符号整数形式的前导0的个数。

数字处理

Math.trunc

用于返回数字的整数部分。

Math.fround

用于获取数字的32位单精度浮点数形式。

判断

Math.sign

判断数字的符号(正、负、0)。

对数方法

Math.expm1()

用于计算 e 的 x 次方减 1 的结果,即 Math.exp(x) - 1 。

Math.log1p(x)

用于计算1 + x 的自然对数,即 Math.log(1 + x) 。

Math.log10(x)

用于计算以 10 为底的 x 的对数。

Math.log2()

用于计算 2 为底的 x 的对数。

双曲函数方法

  • Math.sinh(x): 用于计算双曲正弦。
  • Math.cosh(x): 用于计算双曲余弦。
  • Math.tanh(x): 用于计算双曲正切。
  • Math.asinh(x): 用于计算反双曲正弦。
  • Math.acosh(x): 用于计算反双曲余弦。
  • Math.atanh(x): 用于计算反双曲正切。

对象字面量

属性的简洁表示法

ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值。

方法名也可以简写

如果是Generator 函数,则要在前面加一个星号。在这里详细说一下Generator 函数(https://baijiahao.baidu.com/s?id=1595733115679443901&wfr=spider&for=pc)。

属性名表达式

ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。

注意点:属性的简洁表示法和属性名表达式不能同时使用,否则会报错。

对象的拓展运算符

拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象。

注意点

自定义的属性和拓展运算符对象里面属性的相同的时候:自定义的属性在拓展运算符后面,则拓展运算符对象内部同名的属性将被覆盖掉。

自定义的属性在拓展运算度前面,则变成设置新对象默认属性值。

拓展运算符后面是空对象,没有任何效果也不会报错。

拓展运算符后面是null或者undefined,没有效果也不会报错。

对象的新方法

Object.assign(target, source_1, ···)

用于将源对象的所有可枚举属性复制到目标对象中。

  • 如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。
  • 如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回。

因为 null 和 undefined 不能转化为对象,所以会报错

注意点

assign 的属性拷贝是浅拷贝(浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成野指针错误。)

 

一些其他的ES6方法在后续应用过程中会继续补充。