ECMAScript6 新特征——“变量的解构赋值”

1 数组的解构赋值

ES6许可根据肯定情势,从数组和对象中提取值,对变量举行赋值,这被称为解构(Destructuring)。

基础用法

{
    var [a,[b,c],d,,...f] = [1,[2,3],4,5,6,7];
    console.log(a); //1
    console.log(b); //2
    console.log(c); //3
    console.log(d); //4
    console.log(f); //[6,7]
}

另一种状况是不完全解构,解构赋值不仅适用于var敕令,也适用于let和const敕令

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

默许值

解构赋值许可指定默许值,必需严厉即是undefined时才会见效

let [a,b = 1] = [1,undefined];
console.log(a,b); //1 1

假如默许值是一个表达式,那末这个表达式是默许求值的

let [a = f()] = [undefined];
function f() {
    return 2;
}
console.log(a); //2假如不是undefined,f()不会求值

2 对象的解构赋值

解构不仅能够用于数组,还能够用于对象。

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

假如变量名与属性名不一致,必需写成下面如许。

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

关于let、const而言,变量不能从新声明,所以一旦赋值的变量之前声明过,则会报错

let a2
let {a:a2,b} = {a: 1, b:2}
console.log(a2,b); //Identifier 'a2' has already been declared

所以须要写成下面的情势:

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

这里须要加上小括弧,由于要防止JS引擎将{x}理解为一个代码块

也能够用于嵌套解构的对象

var obj = {
    persion: [
        {name: "Oliver"},
        {friends: ["Alice", "Troy"]}
    ]
}
var {persion: [{name},{friends}]} = obj;
console.log(name,friends); //Oliver ["Alice", "Troy"]

对象的解构也能够指定默许值

var {prop:x = 3} = {prop:undefined};
console.log(x); //3

默许值见效的前提是对象的属性值严厉即是undefined

对象的解构赋值能够很方便地将现有对象的要领赋值到某个变量

var obj = {
    name: "Oliver",
    age: 18
};
var {name,age: x} = obj;
console.log(name,x); //Oliver 18

3 字符串的解构赋值

字符串也能够解构赋值

var {string: [a,b,c]} = {string: "str"};
console.log(a,b,c); //s t r

也能够接见其属性

var {length: len} = "hello";
console.log(len); //5

4 数值和布尔值的解构赋值

解构赋值时,假如等号右侧是数值和布尔值,则会先转为对象。

let {toString: str} = 123;
console.log(str); //toString() { [native code] }
//二者都有toString要领(函数)

5 函数参数的解构赋值

函数的参数也能够解构赋值

function add([x,y]) {
    console.log(x+y);
}
add([1,2]); //3

也能够运用默许值

function add([x,y] = [0,0]) {
    console.log(x+y);
}
add([1,2]); //3
add(); //0

6 圆括号题目

只管不要在情势中运用圆括号

7 现实用处

交流变量的值

var [x,y] = [1,2];
[x,y] = [y,x];
console.log(x,y); //2 1

从函数返回多个值


//返回数组
function init() {
    return [1,2,3];
}
var [a,b,c] = init();
console.log(a,b,c); //1 2 3

//返回对象
function init() {
    return {
        name: "Oliver",
        age: 18
    };
}
var {name: n, age: a} = init();
console.log(n,a); //Oliver 18
var {name} = init();
console.log(name); //Oliver

函数参数的定义

//有序的数组
function init([x,y,z]) {
    return x+y+z;
}
console.log(init([1,2,3])); //6

//无序的对象
function init({x,y,z}) {
    return x+y+z;
}
console.log(init({z:1,y:2,x:3})); //6

提取JSON数据

var obj = {};
var jsonData = {
    name: "Oliver",
    id: "007",
    upload: [1,2,3]
};
{
    let {name,id,upload} = jsonData;
    console.log(name,id,upload); //Oliver 007 [1, 2, 3]
}

函数参数默许值

function f([x,y] = [1,1]) {
    console.log(x+y);
}
f(); //2

遍历Map构造


var 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");
    原文作者:JS菌
    原文地址: https://segmentfault.com/a/1190000004714036
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞