解构(Destructuring)赋值语法是一种Javascript表达式。通过解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量。
对象/数组逐个对应表达式,或成对象字面量和数组字面量。提供了一种简单的定义一个特定的数据组的方法。解构表达式在左边定义了要从原变量中取出什么变量。
解构原理
解构是ES6提供的语法糖,其实是正对”可迭代对象“的Iterator
接口,通过“遍历器”按顺序获取对应的值进行赋值。
解构数组
假设有数组:
1 | const fruits = ['apple', 'banana', 'strawberry']; |
我们从其中解构第一个和第三个,可以在变量声明时并赋值:
1 | const [a, , b] = fruits; |
也可以先声明然后进行赋值:
1 | let a, b; |
设定默认值
为了防止从数组中取出值为undefined
的对象,可以在表达式左侧的数组中为任意对象预设默认值:
1 | let a, b; |
利用解构交换变量
可以用解构的特性,直接交换两个变量的值。例如:
1 | let a = 1, b = 2; |
将剩余元素赋值给一个变量
当解构一个数组时,可以使用剩余模式,将数组剩余部分赋值为一个变量。注意,如果剩余元素右侧有逗号,会抛出SyntaxError
,因为剩余元素必须是左侧数组的最后一个元素。
1 | const fruits = ['apple', 'banana', 'strawberry']; |
数组的对象形式解构
由于数组本质是特殊的对象,因此可以对数组进行对象属性的结构。
1 | const arr = [1, 2, 3, 4, 5]; |
解构对象
对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面。所有的键和值,都会拷贝到新对象上面。
基本赋值:
1 | const obj = { |
无申明赋值(注意外面的括号,如果没有括号的话,左边的{a, b}
会被认为是一个块):
1 | let a, b; |
给新的变量名赋值
在解构赋值的时候,可以给提取的对象属性一个不同的新的名字:
1 | const obj = { |
给新的变量命名并提供默认值:
1 | const {a: newA = 2, b: newB = 3, d: newD = 4} = obj; // newA 值 1, newB 值 2, newD 值 4 |
函数参数默认值
现有一个方法:
1 | function drawChart({size = 'big', cords = {x: 0, y: 0}, radius = 25} = {}) { |
这样,可以在调用的时候传递参数:
1 | drawChart({cords: {x: 18}, radius: 30}); |
对象属性计算名和解构
计算属性名,也可以被解构:
1 | const obj = { |
解构对象时会查找原型链
如果解构的属性不在对象自身,将从原型链中查找。
1 | const obj = {self: 1}; |
解构嵌套对象/数组
保持对象的层级,即可解构嵌套对象
1 | const obj = { |
解构嵌套数组,需要依次对应数组的个数:
1 | const arr = [1, [2, 3], 4, 5]; |
解构String/Map/Set
任何部署了Iterator
接口的对象,都可以用for...of
循环遍历。可以作为“类数组”来进行解构。
String
ES6为字符串添加了遍历接口,使得字符串可以被for...of
来循环:
1 | const str = 'abcde'; |
所以,也可以被解构:
1 | const str = 'abcdefg'; |
Map
Map结构原生支持Iterator
接口,可以直接使用解构语法:
1 | const m = new Map(); |
可以结合for...of
和解构,可以很方便的遍历Map结构:
1 | const m = new Map(); |
Set
Set结构类似于数组,但是成员都是唯一的,没有重复的值。Set结构也原生支持Iterator
接口,可以使用解构语法:
1 | const s = new Set([1, 2, 3, 3]); |
解构常用,但一些偏门的用法还是不晓得,很不明白面试为什么卡这中细小的知识点。
never mind
学到了就是自己的,整理下,我不就知道了么~😎
参考: