美文网首页
ES6 变量的解构赋值

ES6 变量的解构赋值

作者: coolheadedY | 来源:发表于2017-03-01 18:29 被阅读49次

    基本概念

    只要某种数据结构具有Iterator接口都可以采用解构赋值和for of循环 如:
    1数组(有序)
    2对象(无序)
    3字符串
    4类数组
    5map数据结构
    6Generator 函数 (function*)

    基本用法

    var a = 1
    var b = 2
    var c = 3
    

    等同于

    var [a, b, c] = [1, 2, 3]
    

    只有当等号两边的书写模式相同时,才能进行解构赋值

    let [aa,[[bb],cc]] = [11,[[22],33]]
    aa; //11
    bb; //22
    cc; //33
    
    let [,,c] = [1,2,3];
    c; //3 不完全解构
    
    let [one,two,third] = [1,2];
    one; //1
    two; //2
    third; //undefined  不完全解构
    
    let [a,[b],c] = [1,[22,33],3];
    a; //1
    b; //22 注意不是22,33
    c; //3
    

    解构不成功的情况

    let [foo] = 1 //报错error
    var [bar, foo] = [1] //报错error
    

    默认值

    解构赋值允许制定默认值

    let [foo = true] =[];
    foo; //true
    
    let [x, y='b']=['a'];
    x; //a
    y; //b
    
    let [foo = 1] = [undefined]
    foo ; //1
    
    let [mo = 1] = [null]
    mo ; //1
    

    对象的解构赋值(无序)

    对象的解构赋值与数组的解构赋值不同在于,数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

    var { a, b} = { a: "aaa", b: "bbb" };
    a// "aaa"
    b// "bbb"
    
    var { c} = { a: "aaa", b: "bbb" };
    c// undefined
    

    如果左边的变量名和右边的属性名不一致,必须写成

    var { a: d} = { a: "aaa", b: "bbb" };
    d// "aaa"
    
    let obj = { first: 'hello', last: 'world' };
    let { first: f, last: l } = obj;
    f // 'hello'
    l // 'world'
    

    对象的解构赋值要注意被赋值的变量,是key:value的value
    对象的嵌套赋值

    var obj = {
      p: [
        "Hello",
        { y: "World" }
      ]
    };
    
    var { p: [x, { y }] } = obj;
    x // "Hello"
    y // "World"
    //这里被赋值的是obj.p里面的value值
    

    对象解构赋值默认值的写法, 对象的属性值严格等于undefined。

    var {x = 3} = {};
    x // 3
    var {x, y = 5} = {x: 1};
    x // 1
    y // 5
    var {x:y = 3} = {};
    y // 3
    var {x:y = 3} = {x: 5};
    y // 5 注意赋值的属性
    var {x = 3} = {x: undefined};
    x // 3 在设置默认值时undefined不可赋值
    var {x = 3} = {x: null};
    x // null 在设置默认值时null可以赋值,因为null类型为一个具体的值
    

    如果一个变量已经声明,要解构赋值,需要用圆括号括起来,否则会出现解析错误

    var x;
    {x} = {x: 1};// 报错 JS运行机制把{x}当作一个代码块运行,出现语法错误
    
    var x;
    ({x} = {x:1}) // x = 1 正确的写法,和立即执行函数道理相似
    

    字符串的解构赋值

    字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。

    const [a, b, c, d, e] = 'hello';
    a // "h"
    b // "e"
    c // "l"
    d // "l"
    e // "o"
    

    类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

    let {length : len} = 'hello';
    len // 5
    

    同理数组也可以

    let {length : len} = [1,2,3,4,5,6];
    len // 5
    

    数值和布尔值的解构赋值

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

    let {toString: s} = 123; // 把Number对象的toString赋值给s
    s === Number.prototype.toString // true
    
    let {toString: s} = true;  // 把Boolean对象的toString赋值给s
    s === Boolean.prototype.toString // true
    

    函数参数的解构赋值

    函数的参数也可以使用解构赋值。

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

    函数参数的解构也可以使用默认值。

    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]
    

    解构失败的情况,函数move的参数指定默认值(0,0),是整体性的,不是为变量x和y指定默认值。

    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]
    

    解构赋值的便捷使用场景

    • 交换变量的value
    [x, y] = [y, x];
    
    • 函数返回多个value
    // 返回数组
    function fn() {
      return [1, 2, 3];
    }
    var [a, b, c] = fn();
    // 返回对象
    function fn() {
      return {
        foo: 1,
        bar: 2
      };
    }
    var { foo, bar } = fn();
    
    • 函数参数的定义
    // 参数是一组有次序的值
    function f([x, y, z]) { ... }
    f([1, 2, 3])
    // 参数是一组无次序的值
    function f({x, y, z}) { ... }
    f({z: 3, y: 2, x: 1})
    
    • 提取JSON数据
    var json = {
      id: 1,
      status: "OK",
      data: [a, b]
    }
    let { id, status, data: arr} = json;
    console.log(id, status, arr)
    // 1, OK, [867, 5309]
    
    • 加载模块的指定方法
    const { SourceMapConsumer, SourceNode } = require("source-map");
    
    // 按需引入 Element
    import Vue from 'vue'
    import { Button, Select } from 'element-ui' //解构赋值得到指定方法
    
    • 遍历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
    

    只获取键名或键值

    // 获取键名
    for (let [key] of map) {
      // ...
    }
    // 获取键值
    for (let [,value] of map) {
      // ...
    }
    
    • Generator函数的解构
    function* fibs() {
      var a = 0;
      var b = 1;
      while (true) {
        yield a;
        [a, b] = [b, a + b];
      }
    }
    var [first, second, third, fourth, fifth, sixth] = fibs();
    sixth // 5
    

    相关文章

      网友评论

          本文标题:ES6 变量的解构赋值

          本文链接:https://www.haomeiwen.com/subject/jwcfgttx.html