解构赋值

作者: 好奇男孩 | 来源:发表于2018-05-13 01:58 被阅读12次

    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");
    

    相关文章

      网友评论

        本文标题:解构赋值

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