4. 解构赋值

67 阅读3分钟

前言

解构赋值是一种表达式,允许将可迭代对象的值或者属性分配给变量。解构赋值能让我们用更简短的语法进行多个变量的赋值。解构表达式为:array和object

1. 数组表达式解构赋值

常规用法

将数组赋值给多个变量:

ES6之前这样写

var myArray = [1,2,3];
var a = myArray[0];
var b = myArray[1];

解构赋值这样写:

var myArray = [1,2,3];
let a,b,c;
[a,b,c] = myArray;

// 或者
let [a,b,c] = [1,2,3]  // myArray

若左边的数值长度少于右边,左边的变量的值会和右边的一一对应,多余的忽略

忽略数组中的某些值

若只有俩变量,数组有仨值,想跳过第二个赋值给变量,使用解构赋值:

let array = [1,2,3];
let [a, ,b] = [1,2,3];
console.log(a);    // 1
console.log(b);    // 3

使用展开语法

let [a, , ,...b] = [1,2,3,4,5,6];
console.log(a)    // 1
console.log(b)    // 4,5,6
console.log(Array.isArray(b));  // true

使用默认参数

let [a,b,c=3] = [1,2];
console.log(c);   // 3

嵌套数组

从多维数组中提取值并分配给变量

let [a,b,[c,d]] = [1,2,[3,4]];

作为函数参数

function myFunction([a,b,c=3]){
    console.log(a,b,c);    // 1,2,3
}
myFunction(1,2);

或者

function myFunction([a,b,c=3] = [1,2,3]){
    console.log(a,b,c);    // 1,2,3
}
myFunction(undefined);

2. 使用对象表达式解构赋值

常规用法

将对象的属性值赋给多个变量,ES6之前:

var object = {name: "zhangsan", age: 18};
var name = object.name;
var age = object.age;

解构赋值这样写:

let object = {name: "zhangsan", age: 18};
let name, age;
({name, age} = object);

解构赋值变量名和右边的属性名要保持一致,否则变量赋值为undefined。

若想以其他变量名命名,可以这么写:

let object = {name: "zhang", age: 18}
let x,y;
({name: x, age: y} = object);

// 或者
let {name:x, age:y} = {name:"zhang", age:18}

默认参数值

let {a,b,c = 3} = {a: "1", b: "2"};
console.log(c)    // 3

解构赋值时变量名这个支持表达式计算

let {["first" + "Name"]: x} = {firstName: "Eden"};
console.log(x)    // Eden

嵌套对象

从嵌套对象中提取属性,即对象中的对象

let {name, otherInfo: {age}} = {name: "Eden", otherInfo: {age: 18}};
console.log(name, age)    // Eden, 18

作为函数参数

function myFunction({name:"zhang", age:18, sex:"男"}){
    console.log({name,age,sex};    // li 20 男
}
myFunction({name:"li", age:20})

这里我们传递一个空对象作为默认参数值,如果undefined作为函数参数传递,变量将使用默认值

3. 其他用法

解构对象的方法

let {floor,pow} = Math  // 将Math对象的方法提取出来变成一个变量
let a = 1.1;
console.log(floor(a));    // 1
console.log(pow(2,3));    // 8

获取字符串长度

var {length} = "lsc";  // 只能写成length
console.log(length);   // 3

拆分字符串 ??????????(报错)

var [a,b,c,d] = '我是你爹';
console.log(a,b,c,d);

交换变量

let x=1; let y=2;
[x,y] = [y,x];

遍历Map结构

var map = new Map();
map.set('first', 'hello');
mao.set('second', 'world');
for (let [key, value] of map){
    console.log(key + "is" + value);
}

4. 使用场景

当我们与后端API接口做数据交互时,需要处理返回的JSON对象,使用解构赋值简化了代码

let jsonData = {
    id: 42,
    status: "OK",
    data: [832, 1231]
};
let {id, status, data: number} = jsonData;
console.log{id, status, number};