• 变量的解构赋值


    数组的解构赋值

    • 完全解构、不完全解构

    • 如果等号的右边不是数组(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。

    • 解构赋值允许指定默认值。

    • 注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。

    let [x = 1] = [undefined];
    x // 1
    let [x = 1] = [null];
    x // null
    

    上面代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。

    • 如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
    function f() {
      console.log('aaa');
    }
    let [x = f()] = [1];
    

    上面代码中,因为x能取到值,所以函数f根本不会执行。上面的代码其实等价于下面的代码。

    let x;
    if ([1][0] === undefined) {
      x = f();
    } else {
      x = [1][0];
    }
    
    • 默认值可以引用解构赋值的其他变量,但该变量必须已经声明。

    对象的解构赋值

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

    let {foo, bar} = {foo: 'aaa', bar: 'bbb'}
    // 对象的解构赋值是下面形式的简写
    // let {foo: foo, bar: bar} = {foo: "aaa", bar: "bbb"};
    
    • 对象的解构赋值的内部机制:先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

    • 默认值生效的条件是,对象的属性值严格等于undefined。
      如果解构失败,变量的值等于undefined。

    • 如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。

    字符串的解构赋值

    • 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
    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 {toString: s} = 123;
    s === Number.prototype.toString // true
    let {toString: s} = true;
    s === Boolean.prototype.toString // true
    

    上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。

    • 解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
    let { prop: x } = undefined; // TypeError
    let { prop: y } = null; // TypeError
    

    可以使用圆括号的情况

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

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

    上面三行语句都可以正确执行,因为首先它们都是赋值语句,而不是声明语句;其次它们的圆括号都不属于模式的一部分。第一行语句中,模式是取数组的第一个成员,跟圆括号无关;第二行语句中,模式是p,而不是d;第三行语句与第一行语句的性质一致。

  • 相关阅读:
    安装oracle xe一些注意点
    常用的软件设计模式的Java实现——让编程从野生到飞起
    Eclipse oxygen安装中文包
    Centos安装Redis
    Lunx下 怎样启动和关闭oracle数据库
    ORA-12537:TNS:connectionclosed错误处理过程
    启动Oracle时提示:ORA-01078:failure in processing system parameters
    Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
    windows下Tomcat配置多实例
    Liunx下安装jdk7
  • 原文地址:https://www.cnblogs.com/cag2050/p/7592167.html
Copyright © 2020-2023  润新知