ES6、ES7新特性

197 阅读4分钟

1.var let const

(1)var:用var声明的变量既是全局变量,也是顶层变量;使用var声明的变量存在变量提升的情况;使用var声明的变量可以声明多次;在声明前调用返回undefined

(2)let(ES6新增特性):用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,不存在变量提;只要块级作用域内存在let命令,这个区域就不再受外部影响;let不允许重复声明;

(3)const(ES6新增特性):const声明一个只读的常量,一旦声明,常量的值就不能改变(立即初始化,不能留到后面赋值)

2.解构赋值:(要求左右两边的模式相同,同为数组或对象)

`const arrs = {name: "joker", age: 22,marriage: false, addr: {province: "sichuan", city: "chengdu"}}

const { name, age, marriage, addr } = arrs

this.name = "celine"

this.age = 23

this.marriage = true

addr.province = "zhejiang"

addr.city = "yuhang"

console.log(name, age, marriage, addr) // joker 22 false {province: "zhejiang", city: "yuhang"}

console.log(arrs)

// {name: "joker", age: 22, marriage: false, addr: {province: "zhejiang", city: "yuhang"}}`

3.箭头函数:(箭头函数都是匿名函数)

注:箭头函数不会创建自己的this,只会从自己的作用域链的上一层继承this。

不可以改变this的绑定,函数内部的this值不可被改变,在函数的生命周期内始终保持一致。

如果箭头函数被非箭头函数包含,则this绑定的是最近一层非箭头函数的this,否则this的值 会被设置为全局对象。

用了箭头函数,this就不是指向window,而是指向父级(指向是可变的) (1)箭头函数简写:

a:当形参有且只有一个的时候,可以省略()

`let add = n => {

return n + n

}`

b.当代码体只有一句语句的时候,可以省略{},此时return必须省略

用法:let add = n => n * n

const add = n => n * n

console.log(add(2)) // 4

(2)箭头函数和普通函数的区别:

a.箭头函数不具有arguments对象,但每一个普通函数调用后都具备一个arguments对象,用来存储实际传递的参数。但是箭头函数调用后并没有此对象。

b.箭头函数不具有prototype原型对象。箭头函数不具有super。箭头函数不具有new.target

c.箭头函数全是匿名函数,普通函数可以是匿名函数也可以是具名函数。

d.箭头函数不能作为构造函数,不能使用new命令

4.Set(集合):ES6提供的新的数据结构set(集合),本质上是一个对象

let setData = new Set(["张三", "李四", "王五"])

let size = setData.size // 查看数组元素个数

console.log(size) //3

setData.delete("王五") // 删除指定元素

console.log(setData) // {"张三", "李四"}

setData.add("王五") // 添加元素

console.log(setData) // {"张三", "李四", "王五"}

let setDataHas = setData.has("李四") // 检查数组中是否含有该元素,返回布尔值

console.log(setDataHas) // true

6.set的应用:

(1).数组去重

let arrO = [1,2,1,3,4,5,3,4]

let newArrO = [...new Set(arrO)]

console.log(newArrO) // [1,2,3,4,5]

(2).求交集 let arr = [1,2,3,4,5,4,3,2,1]

let arr2 = [4,5,6,8,5]

let arr3 = [...new Set(arr)].filter(item => new Set(arr2).has(item))

console.log(arr3) // [4,5]

(3).求并集

let arr = [1,2,3,4,5,4,3,2,1]

let arr2 = [4,5,6,5,6]

let arr3 = [...newSet([...arr,...arr2])]

console.log(arr3) // [1,2,3,4,5,6]

7.for in、for of和forEach三者的区别

for in这个代码是为普通对象设计的,不适用于数组的遍历

for in不可遍历未枚举的属性

forEach更多的是用来遍历数组

for in一般常用来遍历对象或json

for of数组对象都可遍历,遍历对象需要通过Object.keys()

for in循环出的是key,for of循环出的是value

8.async和await实现异步转同步( es7语法 )

注意:await上面的代码在函数调用时执行,下面的代码需要等待await执行完成后再执行

(1).通常情况下async和await是一起使用的,await后面加的函数是先执行的函数,且此函数必须返回promise对象,await所在的函数必须用async修饰,执行的是async修饰的函数

(2).也就是:

a.先执行的函数:只返回一个promise对象

b.后执行的函数:用async修饰,内部使用await修饰先执行函数,执行的是后执行函数

function fn1() {
    console.log('fn1');
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('fn2')
        }, 1000)
    })
}

async function fn2() {
    console.log('fn2 await 上');
    const result = await fn1()
    console.log(result)
    console.log('fn2 await 下')
}
fn2()
// fn2 await 上
// fn1
// fn2
// fn2 await 下

async和await相比直接使用Promise来说,优势在于处理了then的调用链,能够更清晰的写出代码,但因为await将异步代码改造成了同步代码,所以如果多个异步代码没有依赖性却使用了await就会导致性能降低。