参考:
ES6菜鸟教程

1.新增了块级作用域(let,const)

let

1、声明的变量只在 let 命令所在的代码块内有效。var是在全局
2、let 只能声明一次 var 可以声明多次。
let在循环中异步输出是01234
var在循环中异步输出是55555
3、let 不存在变量提升,var 会变量提升。

const

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

2.提供了定义类的语法糖(class)

本质是function,让对象原型的写法更加清晰,更像面向对象编程的语法

基础用法

类表达式可以为匿名或命名
图片说明

  • 类定义不会被提升,意味着必须在访问前对类进行定义,否则就会报错
  • 类中方法 不需要function关键字
  • 方法间不能用分号

属性

prototype
es6中的class内部只有静态方法,没有静态属性
name 返回跟在class后的类名

方法

constructor方法
是类的默认方法,创建类的实例化对象时被调用
返回对象:
图片说明
静态方法:用类名来调用
图片说明
原型方法:用实例来调用
图片说明
实例方法:(定义在实例对象this上)
图片说明

类的实例化

new:必须通过new关键字
decorator:decorator 是一个函数,用来修改类的行为,在代码编译时产生作用。
类修饰
第一个参数target,指向类本身
图片说明
多个参数:
图片说明

方法修饰
3个参数:target(类的原型对象)、name(修饰的属性名)、descriptor(该属性的描述对象)。
图片说明

3.新增了一种基本数据类型(Symbol)

原本的原始数据类型object,number,string,null, undefined,boolean
表示独一无二的值,最大的用法是用来定义对象的唯一属性名

基本用法

不能使用new命令,因为她不是对象,而是原始数据类型。可以接受一个字符串作为参数,为新创建的symbol提供描述,用来显示在控制台作为字符串的时候使用
图片说明

使用场景

作为属性名:由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。
图片说明
Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。
图片说明

作为常量:可以保证这一组常量的值都不相等。
图片说明

Symbol.for()
Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
图片说明

Symbol.keyFor()
Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
图片说明

4.新增了变量的解构赋值

解构的源,解构赋值表达式的右边部分。
解构的目标,解构赋值表达式的左边部分。

数组模型的解构:

图片说明
图片说明

对象模型的解构

图片说明
图片说明

5.函数参数允许设置默认值,引入了rest参数,新增了箭头函数。

  • 箭头函数提供了一种更加简洁的函数书写方式
    = 参数=>函数体
    图片说明

  • 有多个参数时要括起来

  • 当箭头函数要返回对象时,为了区分于代码块,要用()将对象包裹起来
    图片说明

  • 箭头函数里面是没有this对象的,此时的this是外层的this对象
    图片说明

  • 箭头函数体里的this对象,是定义函数时的对象,而不是使用函数时的对象
    图片说明
    没有call的话应输出20

图片说明

我tm晕了
这是什么鬼

this 指向的是定义的时候外层的 this 对象
图片说明

6.数组新增了一些API,如isArray / from / of 方法;数组实例新增了 entries(),keys() 和 values() 等方法。

7.对象和数组新增了扩展运算符

8.ES6新增了模块化(import / export)

9.ES6新增了Set和Map数据结构。

Map对象:

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

Maps 和 Objects 的区别

  • 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
  • Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
  • Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
  • Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

Map中的key
keyString是键,set第二个参数是值
NaN和任何值都不相等
但作为键是没关系的
图片说明
图片说明

map的迭代
var [key, value] of myMap
myMap.forEach(function(value, key) {
图片说明
图片说明

map对象的操作

  1. map和array的转换
    图片说明

  2. Map 的克隆
    图片说明

  3. Map 的合并
    图片说明

Set 对象

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等
图片说明

类型转化
图片说明

set对象作用
图片说明
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
不会改变原数组

10.ES6原生提供Proxy构造函数,用来生成Proxy实例

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。
Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

Proxy

一个 Proxy 对象由两个部分组成: target 、 handler 。在通过 Proxy 构造函数生成实例对象时,需要提供这两个参数。 target 即目标对象, handler 是一个对象,声明了代理 target 的指定行为。
图片说明

图片说明

图片说明

11.ES6新增了生成器(Generator)和遍历器(Iterator)

迭代器iterator

新的遍历机制:

  • 迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。
  • 迭代器是用于遍历数据结构元素的指针(如数据库中的游标)。

迭代过程:

  1. 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置
  2. 随后通过 next 方法进行向下迭代指向下一个位置, next 方***返回当前位置的对象,对象包含了 value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束
  3. 当 done 为 true 时则遍历结束
    图片说明
    首先创建一个数组,然后通过symbol.iterator方法创建一个迭代器,之后不断的调用next方法对数组内部进行访问,当属性done为true时访问结束。
    迭代器是协议的一部分,关键特性就是它是顺序的:迭代器一次返回一个值,意味着如果可迭代数据结构是非线性的,迭代将会使其线性化

可迭代的数据结构

  • Array
    图片说明
  • String
    图片说明
  • Map
    图片说明
  • Set
    图片说明
  • Dom元素(正在进行中)

//非新增这部分,但是新增方法

1、ES6 String

子串的识别

ES6 新增了子串的识别方法。

  • includes():返回布尔值,判断是否找到参数字符串。
  • startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
    以上三个方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引。
    图片说明

字符串重复

图片说明
图片说明

字符串补全

  • padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
  • padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
    以上两个方法接受两个参数,第一个参数是指定生成的字符串的最小长度,第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。
    图片说明

模板字符串

图片说明
图片说明
图片说明
图片说明
图片说明

ES6数值

图片说明
图片说明
图片说明
parseInt、parseFloat
图片说明
图片说明

isInteger、isSafeInteger
图片说明
图片说明

Math对象的扩展

  1. Math.cbrt立方根Math.cbrt(-1); // -1
  2. Math.imul两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。Math.imul(1, 2); // 2
  3. Math.hypot用于计算所有参数的平方和的平方根。
    图片说明
  4. Math.clz32用于返回数字的32 位无符号整数形式的前导0的个数。
  5. Math.trunc用于返回数字的整数部分。
  6. Math.fround用于获取数字的32位单精度浮点数形式。
  7. Math.sign判断数字的符号(正、负、0)。
  8. Math.expm1()用于计算 e 的 x 次方减 1 的结果,即 Math.exp(x) - 1 。
  9. Math.log1p(x)用于计算1 + x 的自然对数,即 Math.log(1 + x) 。
  10. Math.log10(x)用于计算以 10 为底的 x 的对数。
  11. ath.log2()用于计算 2 为底的 x 的对数。
    图片说明
    2的3次方为8
    2->4->8->16->32->64->128->256

对象

图片说明
图片说明
图片说明

...用于取出参数对象所有可遍历属性然后拷贝到当前对象。
图片说明

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

对象的新方法:
Object.assign(target, source_1, ···)
用于将源对象的所有可枚举属性复制到目标对象中。
如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。
如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回。
assign 的属性拷贝是浅拷贝:
图片说明

Object.is(value1, value2)Object.is(value1, value2)

ES6 数组

数组创建

Array.of()将参数中所有值作为元素形成数组。
图片说明

Array.from()将类数组对象或可迭代对象转化为数组。
图片说明

Array.from(arrayLike[, mapFn[, thisArg]])返回值为转换后的数组
arraylike是类数组对象,必须有length属性,与元素属性名必须是数值或者可转化为数值的字符
mapFn是可选的map函数,用于对每个元素进行处理
thisArg可选,用于指定map函数执行时的this对象
图片说明

图片说明

扩展的方法
查找
find()查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。
图片说明

findIndex()查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。
图片说明

图片说明

遍历
entries()遍历键值对
基于entries()返回的遍历器,调用遍历器的next()方法可以获得每一个元素的访问入口。该入口有一个done属性可以表明是否便利结束。通过入口可以拿到value属性,其就是元素的索引和值的数组。
图片说明
图片说明

图片说明

图片说明

包含

图片说明

图片说明