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就会导致性能降低。