# 解构赋值

# 使用数组表达式解构赋值

E6 之前,我们可以这种形式将数组的内容赋值给多个变量

var newArray = [1, 2, 3];
var  x = newArray[0];
var  y = newArray[1];
var  z = newArray[2];

ES6 中,通过数组解构语法

let newArray = [1, 2, 3];
let x, y, z;
[x, y, z] = newArray;
 //array destructuring assignment syntax
 //简写
 let [a, b, c] = [1, 2, 3];

如果左边的数值少于右边数组的项数,左边变量的值只会和右边数组的内容一一对应,多于的内容将会忽略。 展开语法在解构赋值的应用

let [a, ...b] = [1, 2, 3, 4, 5, 6];
console.log(a);//1
console.log(Array.isArray(b));//true
console.log(b);//2,3,4,5,6
//如果想跳过数组中的部分值,
let [a, , ,...b] = [1, 2, 3, 4, 5, 6];
console.log(a);//1
console.log(b);//4,5,6

解构赋值中,设置变量的默认值:

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

嵌套数组:多维数组中提取值并分配给变量

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

使用数组解构表达式作为函数参数来提取可迭代数组的值,作为参数传递给函数参数,

function myFunction([a, b, c = 3]) {
   console.log(a, b, c); //Output "1 2 3"
}
myFunction([1, 2]);
//函数参数我们可以传递undefined,指定某个具体的参数使用默认值,我们可以使用解构赋值为相关变量提供一组默认值,并传入undefined。
function myFunction([a, b, c = 3] = [1, 2, 3]) {
   console.log(a, b, c);  //Output "1 2 3"
}
myFunction(undefined)

# 使用对象表达式解构赋值

对象解构赋值将对象属性的值赋给多个变量。ES6 之前我们可以这样把对象的属性赋值给多个变量,如下段代码所示:

var object = {name : "John", age : 23};
var name = object.name;
var age = object.age;

在 ES6 里,我们可以使用对象解构表达式,在单行里给多个变量赋值,如下段代码所示:

let object = {name : "John", age : 23};
let name, age;
({name, age} = object);
//object destructuring assignment syntax对象解构赋值的左侧为解构赋值表达式,右侧为对应要分配赋值的对象。解构语句的两边千万不要遗漏左右括号(),否则会报错。

解构对象变量的名称一定要和右边对象的属性名称保持一致,否则会提示变量的值为 undefined。如果你想以其它的变量名进行命名,你可以这么做,如下段代码所示:

let object = {name : "John", age : 23};
let x, y;
({name: x, age: y} = object);
//x,y为对应对象属性的值John,23。如果你输出name或age,编译器则会提示ReferenceError: 变量 is not defined。
//简写
let {name: x, age: y} = {name : "John", age : 23};

在解构对象针对未分配值的变量,我们可以为变量提供默认值,如下段代码所示:

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

在解构对象时变量名支持表达式计算,如下段代码所示:

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

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

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

可以使用对象解构赋值作为函数参数,如下段代码所示:

function myFunction({name = 'Eden', age = 23, profession ="Designer"} = {}){
    console.log(name, age, profession); // Outputs "John 23 Designer"
}
myFunction({name: "John", age: 23});
//传递一个空对象作为默认参数值,如果将undefined作为函数参数传递,变量将使用默认值。

# 其他用法

# 解构对象的方法

比如结构 Math 对象的方法,如下段代码所示:

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

# 获取字符串的长度

var {length}='lxy';
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');
map.set('second', 'world');
for (let [key, value] of map) {
    console.log(key + " is " + value);
}

# 加载指定模块的方法

const { SourceMapConsumer, SourceNode } = require("source-map");

# 常用场景介绍

比如我们经常与后端 API 接口做数据交互,我们需要处理返回的 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]
bookName("ES8 Concepts");
//TypeError: bookName is not a function
var bookName = function (name) {
    console.log("I'm reading " + name);
}

JavaScript引擎只会先提升函数,在提升变量声明,引擎将会对上述代码这样调整,代码如下:

var bookName; // 变量声明提升至最上面
bookName("ES8 Concepts"); 
// bookName is not function 
// because bookName is undefined
bookName = function (name) { // 变量赋值不会被提升
    console.log("I'm reading " + name);
}