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
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'
2
3
4
5
6
复制代码函数参数的定义
一般我们在定义函数的时候,如果函数有多个参数时,在es5语法中函数调用时参数必须一一对应,否则就会出现赋值错误的情况,来看一个例子:
function personInfo(name, age, address, gender) {
console.log(name, age, address, gender)
}
personInfo('william', 18, 'changsha', 'man')
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})
2
3
4
复制代码这么写我们只知道要传声明参数就行来,不需要知道参数的顺序也没关系
交换变量的值
在es5中我们需要交换两个变量的值需要借助临时变量的帮助,来看一个例子:
var a=1, b=2, c
c = a
a = b
b = c
console.log(a, b)
2
3
4
5
复制代码来看es6怎么实现:
let a=1, b=2;
[b, a] = [a, b]
console.log(a, b)
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()
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()
2
3
4
复制代码在函数定义的时候就定义了默认参数,这样就免了后面给参数赋值默认值的过程,是不是看起来简单多了
forEach、for in、for of三者区别
forEach
更多的用来遍历数
for in
一般常用来遍历对象或 json
for of
数组对象都可以遍历,遍历对象需要通过和Object.keys()
for in
循环出的是key,for of
循环出的是value
箭头函数
- 不绑定 this ,this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()
- 不能够使用arguments对象,取而代之用 rest (扩展运算符)参数...解决
- 匿名函数,不能作为构造函数,不能使用 new
- 不可以使用yield命令,因此箭头函数不能用作 Generator 函数
- 通过call()或apply()方法调用一个函数时,只传入了一个参数,对 this 并没有影响
- 没有原型属性
Set、Map的区别
应用场景 Set 用于数据重组, Map 用于数据储存
Set:
- 成员不能重复,值唯一
- 只有键值没有键名,类似数组
- 可以遍历,方法有 add , delete , has
Map:
- 本质上是健值对的集合,类似集合
- 可以遍历,可以跟各种数据格式转换
Promise
详细可参考
一个简单示例
var promise = new Promise((resolve,reject) => {
if (操作成功) {
resolve(value)
} else {
reject(error)
}
})
promise.then(function (value) {
// success
},function (value) {
// failure
})
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的成功和失败情况下的回调函数