ES6:变量的解构赋值

558 阅读2分钟

###数组的解构赋值

  • 可以以如下方式赋值
    let [a, b, c] = [1, 2, 3];
    let [ , , third] = ["foo", "bar", "baz"];
    third // "baz"
    
    
    两边模式相同,变量就会被赋予相对应的值
  • 不完全解构
    let [x, y] = [1, 2, 3];
    x // 1
    y // 2
    
  • 若右边数据结构具有Iterator接口,都可以进行数组解构赋值(如generator函数)
  • 允许有默认值,等号右边对应值完全等于undefined默认值才生效
    let [x = 1] = [undefined];
    x // 1
    let [x = 1] = [null];
    x // null
    
  • 如果默认值是表达式,那么表达式会惰性求值,用到才会求值

###对象的解构赋值

  • 对象属性没有次序,只要名字相等就可以赋值
    let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
    foo // "aaa"
    bar // "bbb"
    let { baz } = { foo: 'aaa', bar: 'bbb' };
    baz // undefined
    
  • 也可以如下操作
    // 例一
    let { log, sin, cos } = Math;
    // 例二
    const { log } = console;
    log('hello') // hello
    
  • 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
    let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
    baz // "aaa"
    foo // error: foo is not defined
    
  • 与数组一样,解构也可以用于嵌套结构的对象
  • 对象解构也可以指定默认值,与数组结构类似
  • 只有不将大括号写在行首,js才不会把他解析成代码块
    let x;
    ({x} = {x: 1});//正确写法
    {x} = {x: 1};//报错,会被解析成代码块
    
  • 可以对数组进行对象的解构赋值
    let arr = [1, 2, 3];
    let {0 : first, [arr.length - 1] : last} = arr;
    first // 1
    last // 3
    

###字符串的解构赋值

const [a, b, c, d, e] = 'hello';

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

  • 若等号右边是数值或布尔值,会先转换成对象
    let {toString: s} = 123;
    s === Number.prototype.toString // true
    let {toString: s} = true;
    s === Boolean.prototype.toString // true
    
    以上代码的123和true转换成对象后都有toString属性,故变量s能被赋值

###函数参数的解构赋值

function add([x, y]){
  return x + y;
}
add([1, 2]); // 3
  • 参数解构也可以使用默认值

###圆括号的使用 +情况只有一种,赋值语句的非模式部分可以使用圆括号

[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确

###用途

  • 交换变量值
let x = 1;
let y = 2;
[x, y] = [y, x];
  • 从函数返回一个数组或对象用于解构赋值
  • 函数参数定义
  • 提取JSON对象