ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
数组的解构
let [a,b,c] = [1,2,3]
console.log(a, b, c)
let [a, [b], c] = [2, [3], 4]
a //2
b //3
c //4
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...e] = ['a'];
x // "a"
y // undefined
e// []
注意
let [a] = 1 //报错
let [a]=[2] //a=2
不完全解构
let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4
只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值
function* fibs() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
let [first, second, third, fourth, fifth, sixth] = fibs();
sixth // 5
默认值
let [a, b = 2] = [3]
a // 3
b // 2
let [a, b = 2] = [3, 4]
a //3
b //4
ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效
let [a=2, b=3] = [undefined, null]
a //2
b //null
数组对应对值有没有?如果没有(数组对没有指undefined)就使用默认值,如果有就使用对应值
let [a=1, b=a] = [2]
a //2
b //2
对象的解构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值
let {name, age} = {name: 'jirengu', age: 4}
name //‘jirengu’
age //4
以上代码等同于
let name
let age
({name: name, age: age} = {name: 'jirengu', age: 4})
解构嵌套结构的对象
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
默认值
let {x, y=5} = {x: 2}
x //2
y //5
var {x: y = 3} = {};
y // 3
默认值生效的条件是,对象的属性值严格等于undefined
var {x = 3} = {x: undefined};
x // 3
var {x = 3} = {x: null};
x // null
解构赋值的规则是
只要等号右边的值不是对象或数组,就先将其转为对象
字符串的解构赋值
字符串被转换成了一个类似数组的对象,类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
数值和布尔值的解构赋值
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
函数解构
- 函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y
- 函数参数的解构也可以使用默认值
function add([x=1, y=2]){
return x+y
}
add() //Error
add([2]) //4
add([3,4]) //7
function add(x=1, y=2){
return x+y
}
add() //3
undefined才会触发函数参数的默认值
function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
function move({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
范例
交换
let [x, y] = [1, 2];
[x, y] = [y, x]
x //2
y // 1
默认方法
function ajax({url, type=‘GET’}){
}
ajax({url: ‘http://localhost:3000/getData’})
从函数返回多个值
// 返回一个数组
function example() {
return [1, 2, 3];
}
let [a, b, c] = example();
提取 JSON 数据
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]
遍历 Map 结构
const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world
输入模块的指定方法
const { SourceMapConsumer, SourceNode } = require("source-map");
网友评论