ES6及相关

var、let、const之间的区别

var 声明变量可以重复声明,而 let 不可以重复声明
var 是不受限于块级的,而 let 是受限于块级
var 会与 window 相映射(会挂一个属性),而 let 不与 window 相映射
var 可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错(必须先声明)
const 声明之后必须赋值,否则会报错
const 定义不可变的量,改变了就会报错
const 和 let一样不会与 window 相映射、支持块级作用域、在声明的上面访问变量会报错

解构赋值

数组解构

let [a, b, c] = [1, 2, 3]   //a=1, b=2, c=3
let [d, [e], f] = [1, [2], 3]    //嵌套数组解构 d=1, e=2, f=3
let [g, ...h] = [1, 2, 3]   //数组拆分 g=1, h=[2, 3]
let [i,,j] = [1, 2, 3]   //不连续解构 i=1, j=3
let [k,l] = [1, 2, 3]   //不完全解构 k=1, l=2
1
2
3
4
5

复制代码对象解构

let {a, b} = {a: 'aaaa', b: 'bbbb'}      //a='aaaa' b='bbbb'
let obj = {d: 'aaaa', e: {f: 'bbbb'}}
let {d, e:{f}} = obj    //嵌套解构 d='aaaa' f='bbbb'
let g;
(g = {g: 'aaaa'})   //以声明变量解构 g='aaaa'
let [h, i, j, k] = 'nice'    //字符串解构 h='n' i='i' j='c' k='e'
1
2
3
4
5
6

复制代码函数参数的定义

一般我们在定义函数的时候,如果函数有多个参数时,在es5语法中函数调用时参数必须一一对应,否则就会出现赋值错误的情况,来看一个例子:

function personInfo(name, age, address, gender) {
  console.log(name, age, address, gender)
}
personInfo('william', 18, 'changsha', 'man')
1
2
3
4

复制代码上面这个例子在对用户信息的时候需要传递四个参数,且需要一一对应,这样就会极易出现参数顺序传错的情况,从而导致bug,接下来来看es6解构赋值是怎么解决这个问题的:

function personInfo({name, age, address, gender}) {
  console.log(name, age, address, gender)
}
personInfo({gender: 'man', address: 'changsha', name: 'william', age: 18})
1
2
3
4

复制代码这么写我们只知道要传声明参数就行来,不需要知道参数的顺序也没关系

交换变量的值

在es5中我们需要交换两个变量的值需要借助临时变量的帮助,来看一个例子:

var a=1, b=2, c
c = a
a = b
b = c
console.log(a, b)
1
2
3
4
5

复制代码来看es6怎么实现:

let a=1, b=2;
[b, a] = [a, b]
console.log(a, b)
1
2
3

复制代码是不是比es5的写法更加方便呢

函数默认参数

在日常开发中,经常会有这种情况:函数的参数需要默认值,如果没有默认值在使用的时候就会报错,来看es5中是怎么做的:

function saveInfo(name, age, address, gender) {
  name = name || 'william'
  age = age || 18
  address = address || 'changsha'
  gender = gender || 'man'
  console.log(name, age, address, gender)
}
saveInfo()
1
2
3
4
5
6
7
8

复制代码在函数内先对参数做一个默认值赋值,然后再使用避免使用的过程中报错,再来看es6中的使用的方法:

function saveInfo({name= 'william', age= 18, address= 'changsha', gender= 'man'} = {}) {
  console.log(name, age, address, gender)
}
saveInfo()
1
2
3
4

复制代码在函数定义的时候就定义了默认参数,这样就免了后面给参数赋值默认值的过程,是不是看起来简单多了

forEach、for in、for of三者区别

forEach更多的用来遍历数
for in一般常用来遍历对象或 json
for of数组对象都可以遍历,遍历对象需要通过和Object.keys()
for in循环出的是keyfor of循环出的是value

箭头函数

  1. 不绑定 this ,this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()
  2. 不能够使用arguments对象,取而代之用 rest (扩展运算符)参数...解决
  3. 匿名函数,不能作为构造函数,不能使用 new
  4. 不可以使用yield命令,因此箭头函数不能用作 Generator 函数
  5. 通过call()或apply()方法调用一个函数时,只传入了一个参数,对 this 并没有影响
  6. 没有原型属性

Set、Map的区别

应用场景 Set 用于数据重组, Map 用于数据储存
Set:

  1. 成员不能重复,值唯一
  2. 只有键值没有键名,类似数组
  3. 可以遍历,方法有 add , delete , has

Map:

  1. 本质上是健值对的集合,类似集合
  2. 可以遍历,可以跟各种数据格式转换

Promise

详细可参考

一个简单示例

var promise = new Promise((resolve,reject) => {
    if (操作成功) {
        resolve(value)
    } else {
        reject(error)
    }
})
promise.then(function (value) {
    // success
},function (value) {
    // failure
})
1
2
3
4
5
6
7
8
9
10
11
12

简要概述
三种状态:进行中状态pending、完成状态Fulfilled、失败状态Rejected
四个promise的静态方法:

  • Promise.resolve()它相当于创建了一个立即resolve的对象
  • Promise.reject()它相当于创建了一个立即reject的对象
  • Promise.all() 它接收一个promise对象组成的数组作为参数,并返回一个新的promise对象
  • Promise.race() 它接收一个promise对象组成的数组作为参数,并返回一个新的promise对象与Promise.all()不同,它是在数组中有一个对象(最早改变状态)resolve或reject时,就改变自身的状态,并执行响应的回调。

.then接受什么参数类型:参数就是个Promise

.then有几个参数:就二个参数promise的成功和失败情况下的回调函数

上次更新时间: 10/12/2019, 8:35:23 PM