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无法转换为对象,所以解构赋值报错

  • 相关阅读:
    手脱ASPack2.12壳(练习)
    手脱UPX3.91壳(练习)
    如何在程序执行前插入可执行代码(算是吾爱的作业吧,活学活用)
    小米笔记本粉丝感恩狂欢趴【慎入!!】
    picpick截屏软件脱壳
    JAVA反序列化漏洞
    Java中的数据类型
    Java中常见的包
    Scrapy
    PHPstorm 函数时间注释的修改
  • 原文地址:https://www.cnblogs.com/ashen1999/p/12559767.html
Copyright © 2011-2022 走看看