前言

最近在看ES6+的一些更新特点,又重新从各数据类型及语法上温习了一遍ES6。突然有了一点想法,那就尝试着从三个特点来去简单总结和理解一下ES6的更新。这三个特点分别是:标准化更丰富更高级

特点一:标准化

变量新声明语句:let

简单举一个let的优势

  • 不允许重复声明:var是允许一直声明的,是完全不符合的一个常规操作
var min = 20

//...
//...
//...
//...
//...

// 此时声明变量,按道理来讲声明变量未赋值,应为 undefined 。
// 但是,由于上面声明过并且赋值过,所以此时声明并不是希望的一个结果。它的值是依然是 20
var min

console.log(min) // 20

如果使用let语句声明,在代码运行时就报错了。而不会等到在业务逻辑中才发现异常。

那其他特点有:

  • 不存在变量提升:符合先声明后使用
  • 暂时性死区:在声明区块中,会绑定这个区块,防止未声明即使用
  • 块级作用域:常用于for循环,index泄漏
  • 全局声明不归window所属

常量:const

在ES5之前没有常量的概念,在一大段逻辑中例如在顶部声明的变量,可能会在逻辑中进行更改以影响下面的代码或者产生未知后果。那么常量出现后就可以使用常量来表示这个值不可进行更改

const min = 20

//...
//...
//...
//...
//...

min = 50  // TypeError: Assignment to constant variable. 

此时就会抛出错误,而且编辑器也会很好的提示代码写错了。或许不用等代码运行就发现错误了

Reflect对象

Reflect对象是用来去操作一个对象的新API,目的是:

  • 将一些原本要属于JavaScript语言的方法挂载到Reflect对象中,例如:Object.defineProperty放在了Reflect.defineProperty
  • 并可以得到方法执行的操作结果,例如:Reflect.defineProperty
  • 将过去一些操作符函数化例如:prop in object
const obj = {
  min: 20
}

// 冻结一个对象
Object.freeze(obj)

// 报错
Object.defineProperty(obj, 'max', {  // TypeError: Cannot define property max, object is not extensible
  configurable: false
})
// 使用Reflect下的方法
console.log(Reflect.defineProperty(obj, 'max', {})) // 不会报错,返回 false

函数化:

const obj = {
  min: 20
}
// 旧写法
delete obj.min

// 函数化之后
Reflect.deleteProperty(obj, 'min')

将一些全局函数移植到本该属于它的对象下

例如:parseInt、parseFloat 移植到 Number 对象下

console.log(parseInt === Number.parseInt) // true

class

过去使用函数来当做一个类,现在可以用 class 来去按照传统语言的方式去编写一个类和完成最友好的继承

特点二:更丰富

新增数据类型

新增Symbol来表示独一无二的值

新增方法

在各数据类型中新增了一些方法,包括静态方法,例如:

  • 静态方法
    • Array.isArray
    • Object.keys
    • ..
  • 原型方法
    • Array.prototype.includes
    • String.prototype.trimEnd
    • Object.is
    • ..

新增数据结构

Set、Map、WeakSet、WeakMap 来补充数组、对象的一些无法做到的事情

新增对象

新增Promisi来解决异步操作、回调地狱的问题

新增Reflect、Proxy、class去增强对象的操作

特点三:更高级

语法糖、扩展、运算法等

例如:

  • 解构赋值
  • rest 参数
  • 运算符 ** ?.
  • async
  • generator、yield

新增模块化 module

例如在nodejs使用 require 就是一种模块化,但仅限于 nodejs中。ES6新增了module是采用 import 实现引入、export 导出模块

iterator 接口及新的循环 for…of

在一些原生对象中新增 iterator 提供一种新的访问机制。例如:

  • String
  • Array
  • Map
  • Set
  • arguments
  • NodeList
  • TypedArray