let { foo: a, bar:b } = { foo: "aaa", bar: "bbb" }; 被赋值的是ab变量
也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
let foo;
({foo} = {foo: 1}); // 成功
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p: [x, { y }] } = obj;
x // "Hello"
y
p只是模式,不是变量,不会被赋值,x,y是变量可被赋值;
在结构赋值的时候我们要分清楚左边的模式,和变量;
var {x:y = 3} = {x: 5};
y // 5
对象的解构可以指定默认值
字符串的解构
let {lenght:len} = 'hello';
数值和布尔值的解构赋值
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined
和null
无法转为对象,所以对它们进行解构赋值,都会报错。
函数参数的解构赋值
[[1, 2], [3, 4]].map(([a, b]) => a + b);
// [ 3, 7 ]
变量解构的用途
1.交换变量的值
2.当函数返回多个值的时候,取值比较方便,直接解构的方法去接;
3.提取json数据,解构直接取值;一般在后台借口返回值中直接用
let {} = dataObj;
4.遍历map解构, for(let [key,value] of mapOBj)
5.输入模块的指定方法时可以用解构
const { SourceMapConsumer, SourceNode } = require("source-map");