zoukankan      html  css  js  c++  java
  • 解构赋值

    解构赋值

    数组的解构赋值

    • 只要等号两边的模式相同,左边的变量就会被赋予对应的值

      let [x, y, z] = [1, 2, 3]
      let [a, [[b], c]] = [1, [[2] ,3]]
    • 如果解构不成功,变量的值就为undefined

    • 等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。称为不完全解构

      let [a, b] = [1, 2, 3]
      a//1
      b//2
    • 如果等号右边的不是数组,将会报错

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

    默认值

    • 允许指定默认值

      let [foo = true] = []//foo:true
      let [a, b = 2] = [1]//a:1,b:2
      let [a, b = a] = [1, undefined]//a:1,b:1
    • 只有当一个数组成员严格等于undefined,默认值才会生效

      let [x = 1] = [null]
      //此时x等于null
    • 如果默认值是一个表达式,则此表达式是惰性求值的

      function f(){
         return 1;
      }
      let [x = f()] = [2]//x:2 不会执行函数f

    对象的解构赋值

    • 因为对象的属性没有次序,所以变量必须与属性同名,才能取到正确的值

      let {foo, message} = {foo: '111', message: 222};

      let {ashen, xing} = {xing: 23, ashen: 20};
    • 如果解构失败,变量的值等于undefined

    • 对象的解构赋值可以取到继承的属性

      const obj1 = {};
      const obj2 = { foo : 'bar' };
      Object.setPrototypeOf(obj1,obj2);
      const { foo } = obj1;
      //此时虽然obj1没有foo属性,但其原型对象是obj2,继承了其属性,所以解构赋值成功

    注意

    • 在将一个已经声明了的变量进行解构赋值时,大括号不能写在行首,否则会被js解析成块级作用域,出现语法错误

      • 应该用()将解构赋值包裹起来

      let x;
      {x} = {x:1} //报错
      ({x} = {x:1}) //不报错
    • 解构赋值允许等号左边的模式中不放置任何变量名,虽然无意义,但合法。

    • 由于数组本质是特殊的对象,隐藏可以对数组进行对象属性的解构

      let arr = [1, 2, 3]
      let { 0 : first, [arr.length - 1] : last} = arr
      //键值为0的值是1,first:1
      //键值为2的值为3,last:3

    数值和布尔值的解构赋值

    • 如果等号右边不是数组或对象,则会先转换为对象

      let {toString: s} = 123;
      //123转为对象后:Number 具有toString方法,所以s为true

      let {toString: s} = true;
      //true转为对象后:Boolean 具有toString方法,所以s为true
    • 由于undefinednull无法转换为对象,所以解构赋值报错

  • 相关阅读:
    STL堆实现
    Project Loom:Reactive模型和协程进行时(翻译)
    2020年最佳Java调试工具(翻译)
    布隆过滤器-使用场景的思考
    Logback,SLF4J,Log4J2。了解它们并学习如何使用。(翻译)
    使用Merkle树检测数据不一致(翻译)
    cassandra中的ACID,与RDBMS中的事务有何不同?
    Cassandra数据建模中最重要的事情:主键
    认证授权-学习笔记2-OpenId Connect
    jwt的思考
  • 原文地址:https://www.cnblogs.com/ashen1999/p/12559767.html
Copyright © 2011-2022 走看看