总结下es6的解构赋值

1,031 阅读3分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

问题

面试官:你能讲一下es6的解构赋值吗?

面试者: 可以,主要是针对对象和数组。方便快捷的取到它们内部的值。

面试官: 那对象的解构能取到它原型上的值吗?

面试者:额。。。这个没注意

面试官:哦

以上场景纯属虚构。

今天来总结下es6的解构赋值,包括数组,对象等类型的解构赋值,看看有哪些知识点是自己没有掌握的,一起来学学吧。

解构赋值

就是从给的数据(比如数组,对象等)里提取出目标值,并赋值给变量。 如果数据不是对象类型,则会把它转成对象类型,如果不能转,则会报错。

var {a} = null // error
var {a} = undefined // error

var {length} = '123' // 转成字符串对象,它有length属性
console.log(length) // 3

数组

数组是通过顺序来提取的,提取到了就赋值给对应下标的变量。 变量可以随意命名。

如果变量多了则多出的没匹配上的变量是undefined

如果变量少了则只赋值对应的变量。

var [first,second] = [1,2,3]
console.log(first, second)  // 1 2

var [first,second, third, fourth] = [1,2,3]
console.log(first, second, third)  // 1 2 3
console.log(fourth)  // undefined

数组的解构还支持嵌套。

var [one,[two]] = [1,[2],3]
console.log(two) // 2

可以给变量设置默认值,如果变量没有匹配上,则会使用默认值代替undefined

变量没有匹配上的条件是没有对应的值或者对应的值全等于undefined

var [first] = []
console.log(first) // undefined

var [first = 'a'] = []
console.log(first) // 'a'

var [first = 'a'] = [undefined]
console.log(first) // 'a'

var [first = 'a'] = [null]
console.log(first) // null

var [first = 'a'] = [0]
console.log(first) // 0

默认值也可以使用变量名,前提是需要先声明了再使用。

var [first, second = first] = [1]
console.log(first, second) // 1, 1

如果你只想取第二个值,可以这样写

var [,second] = [1,2]
console.log(second) // 2

对象

对象的解构不是按照顺序的,而是匹配key和变量名是否一致,如果一致,则把key对应的value赋值给变量。不一致的话就是undefined

var {a, b} = {a:1, b:2}
console.log(a,b) // 1 2

var {c} = {a:1, b:2}
console.log(c) // undefined

如果你想自己自定义变量,可以这样写,但是后面就只能通过自定义变量访问了。

var {a: first} = {a:1, b:2}
console.log(first) // 1
console.log(a) // a is not defined

对象的解构还支持嵌套,也支持取到它原型上的值。

var {a: {b}} = {a: {b:2}}
console.log(b) // 2

// 设置原型对象
var obj = Object.create({a:1})
var {a} = obj 
console.log(a) // 1

和数组一样,也支持给变量设置默认值。

// 空值会使用默认值
var {a = 123, b = 456} = {}
console.log(a, b) // 123  456

// undefined会使用默认值
var {a: first = 123} = {a: undefined}
console.log(first) // 123

var {a: first = 123} = {a: null}
console.log(first) // null

其它

也可以对函数的参数进行解构,也可以设置默认值

function fn ({a = 1, b = 2} = {}) {
  return a + b
}
fn({a: 10, b: 20}) // 30
fn({a: 10}) // 12
fn() // 3

解构赋值用在交换值非常方便

var a = 1, b = 2;
[b,a] = [a,b]
console.log(a, b) // 2 1

针对Map解构的遍历和对象的Object.entries方法,使用解构赋值也很方便

var map =  new Map([
  ['a', 1],
  ['b', 2]
])
for(let [key, val] of map) {
  console.log(key, val)  
  // a 1
  // b 2
}

var obj = {a: 1, b: 2}
for (let [key, val] of Object.entries(obj)) {
    console.log(key, val)
    // a 1
    // b 2
}

参考

变量的解构赋值