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

2.变量的解构赋值

作者: 毛贵军 | 来源:发表于2019-01-25 09:30 被阅读0次

    回到目录

    前言

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

    提示

    本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。
    (简单来说就是格式不匹配就会报错)

    数组的解构赋值

    只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。

    let [foo, [[bar], baz]] = [1, [[2], 3]];
    foo; // 1
    bar; // 2
    baz; // 3
    
    let [, , third] = ["foo", "bar", "baz"];
    third; // "baz"
    
    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, ...z] = ["a"];
    x; // "a"
    y; // undefined
    z; // []
    
    let [foo, [[bar], baz]] = [1, [4, 3]];
    // Uncaught TypeError: [1,[4,3]] is not iterable  at <anonymous>:1:27
    // 这里报错的原因是 [bar]  最后只能匹配到 4 ,这两个结构不匹配
    
    let [foo = true] = [];
    foo; // true
    
    let [x, y = "b"] = ["a"]; // x='a', y='b'
    let [x, y = "b"] = ["a", undefined]; // x='a', y='b'
    

    对象的解构赋值

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

    例子

    let obj3 = {
      p: ["Hello", { y: "World" }],
      q: { a: 15 }
    };
    
    let {
      p,
      p: [x, { y, z = 16 }],
      q: Q
    } = obj3;
    x; // "Hello"
    y; // "World"
    p; // ["Hello", {y: "World"}]
    z; // 16
    q; // Uncaught ReferenceError: q is not defined
    Q; // {a: 15}
    

    总结

    类别 结论
    数组的解构 按照遍历器 iterator 来依次赋值
    对象的解构 按照 key 来配对赋值

    例子

    let [a, b, c] = { 1: 15, 2: "a", 3: [1, 2, 3] };
    // VM191:1 Uncaught TypeError: {(intermediate value)(intermediate value)(intermediate value)} is not iterable
    
    var { 0: a, 1: b } = [12, 15];
    a; // 12
    b; // 15
    

    其他数据类型的解构

    其他数据类型在执行解构之前,会先转换成相应的对象,比如 123456 -> Number(123456), false ->Boolean(false) NaN -> NaN
    回到目录

    相关文章

      网友评论

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

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