数组的解构赋值
let [a,b,c] = [1,2,3];
a //1
b //2
c //3
模式匹配,只要等号两侧模式相同,左边的变量就会被赋予对应的值。
- 解构不成功,变量的值等于
undefined
- 解构可以嵌套;
- 右边不是可遍历的结构,将会报错;
- 只要某种数据结构具有
Iterator
结构,即可使用数组形式的解构赋值; - 解构赋值允许使用默认值;若数组成员不严格等于(!===)
undefined
,默认值不会生效
let [x=1] = [undefined] //x=1
let [x=1] = [null] //x=null
- 默认真可以引用解构赋值的其他变量,但该变量必须已经声明。
let [x=1,y=x] = []; //x=1;y=1
let [x=y,y=1] = []; //ReferenceError: can't access lexical declaration `y' before initialization
对象的解构赋值
由于对象的属性没有次序,区别与数组
let { foo:foo,bar:bar } = {foo:"aaa",bar:"bbb"} //完整形式
let { foo,bar } = {foo:"aaa",bar:"bbb"} //简写形式
对象的解构赋值的内部机制是:先找到同名属性,然后再赋值给对应的变量。真正被赋值的是后者
let { foo:baz } = {foo:"aaa",bar:"bbb"}
baz // "aaa"
foo // error:foo is not defined
foo是匹配的模式,baz才是变量。真正被赋值的是变量baz.
如果要将一个已经声明的变量用于解构赋值,则会报错。Javascript引擎会将{x}理解成代码块,从而发生语法错误。
let x;
{x}={x:1} //SyntaxError: expected expression, got '='
//正确写法
let x;
({x}={x:1});
字符串也可解构赋值
数值和布尔值的解构赋值
解构赋值的规则:只要等号右边的值不是对象或者数组,就先将其转为对象。因为
undefined
和null
无法转为对象,所以对他们进行解构赋值会报错。
let {prop:x} = undefined; //TypeError: undefined has no properties
let {prop:y} = null; //TypeError: null has no properties
函数参数也可解构赋值
解构赋值的用途
- 交换变量的值
let x = 1;
let y = 2;
[x,y] = [y,x]
- 从函数返回多个值
function example(){
return [1,2,3]
}
let [a,b,c] = example()
- 函数参数的定义
方便的将一组参数与变量名对应起来,可以是有次序的值也可以是无次序
function f({x,y,z}){
...
}
f({z:3,y:2,x:1})
- 提取JSON数据
let jsonData = {
id: 42,
status: "OK",
data: [867,5309]
};
let { id, status, data: number } = jsonData;
id //42
status //"OK"
number //[867,5309]
- 函数参数的默认值,指定参数的默认值
function foo({x, y = 5} = {}) {
console.log(x, y);
}
foo() // undefined 5
- 遍历map结构
任何部署了Iterator接口的对象都可以用for…of循环遍历。map结构原生支持Iterator。
let map = new Map();
map.set("f","hello");
map.set("s","world")
for (let [key,value] of map){
console.log(key +' '+ value)
}
// f hello
// s world
- 输入模块的制定方法
const { SourceNode } = require("source-map")