解构赋值 Destructuring Assignment

ES6中可以通过一定的模式将数组或对象中的值直接赋值给外部变量,称为解构

  1. 对象的解构赋值

     // 在ES5中,当需要获取一个对象中的变量值的时候,不得不进行过如下操作
    const person = {
    name: 'zhang',
    age: 18,
    hobby: 'coding'
    }
    let name = person.name;
    let age = person.age;
    let hobby = perosn.hobby;
    // do something

    // 在ES6中能够对对象进行解构赋值
    const {name, age, hobby} = person;
    console.log(name, age, hobby); // zhang 18 coding
    // 以上情况必须保证外部变量名与解构的对象中的变量名一致
    • 对象解构过程中,外部变量名也可以与对象内部变量名不同,但此时不可以使用对象的缩写形式

    const person = {
    name: 'zhang',
    age: 18,
    hobby: 'coding'
    }

    const {name, age, hobby} = person;
    // 上面的解构表达式实际上是一种缩写形式
    // 其完整的形式如下:
    const {name: name, age: age, hobby: hobby} = person;
    // 只是在ES6中对象内部的属性名省略了,因此必须保证外部的变量名与对象内部变量名一致
    • 当外部变量名与对象内部变量名不同时,必须要写完整的形式

     const person = {
    name: 'zhang',
    age: 18,
    hobby: 'coding'
    }

    const {name: newName, age: newAge, hobby: newHobby} = person;
    console.log(newName, newAge, newHobby); // log 'zhang 18 coding'
    // 对象解构赋值是将对象中而定变量赋值给newName,而不是赋值给name
    • 对象解构的嵌套

     const family = {
    father: {
    name: 'fname',
    age: 50
    },
    mother: {
    name: 'mname',
    age: 48
    },
    me: {
    name: 'zhang',
    age: 18
    }
    }

    const {name: myName, age: myAge} = family.me;
    console.log(myName, myAge); // log 'zhang 18'
    const {b} = a;
    const {b: {c}} = a;
    const {b: {c: {d}}} = a;
    const {b: {c: {d: {e}}}} = a;
    console.log(b); // {c:{d:{e:{str: 'this is a string'}}}}
    console.log(c); // {d:{e:{str: 'this is a string'}}}
    console.log(d); // {e:{str: 'this is a stirng'}}
    console.log(e); // {str: 'this is a stinrg'}
    // 当结构复杂的时候可能需要慢慢分析
    • 当出现结构失败的情况是,会给变量赋值undefined

      const person = {
      name: 'zhang',
      age: 18,
      hobby: 'coding'
      }

      const {hate} = person;
      console.log(hate); // undefined
      // 当结构的变量不存在时,会给变量赋上undefined
    • ES6中允许为变量添加默认值,当变量的解构赋值失败 --> 为变量赋值为undefined时,可以给变量添加默认值

      需要注意的是:只有当变量值严格等于(===)undefined时才会赋默认值,当变量值为空串,false或者null时,是不会为变量赋默认值的

       const car = {
      price: 500000,
      brand: 'BMW'
      }

      const {price='30000', brand='Mini', color='red'} = car;
      console.log(price, brand, color); // log '500000 BMW red'
      // 当进行解构赋值时,color赋值失败,其值为undefined,但在结构过程中为color指定默认值,因此,color被赋值'red'


      // 比较
      let obj = {
      prop1: undefined,
      prop2: '',
      prop3: null,
      prop4: false
      }

      const {prop1 = '1', prop2 = '2', prop3 = '3', prop4 = '4', prop5 = '5'} = obj;
      console.log(prop1, prop2, prop3, prop4, prop5);
      // log '1 null false 5'
      // 当然空串输出是看不见的,此时只有prop1和prop5被赋上默认值,可以说明,只有当变量的值严格等于undefined时,才会触发默认赋值的操作
  2. 数组的解构赋值 ES5中想要获取数组元素的值,就要通过数组的索引值

     const numList = [100, 200];
    const first = numList[0];
    const last = numList[numList.length - 1];
    console.log(first, last); // log "100 200"

    ES6中同样为数组提供了解构赋值

     const numList = [100, 200];
    const [first, second] = numList;
    console.log(first, second); // log "100 200"

    数组解构赋值的语法与对象的解构赋值类似,对应位置上的值可以赋值给变量。 考虑到数组的本质上也是一个对象,于是做了个测试,使用对象的对象解构赋值的方式获取数组的元素

    const numList = [1, 2, 3, 4];
    const {"0": num1, "1": num2} = numList;
    console.log(num1, num2); // log "1 2"
    // 使用数组解构伪数组的时候发现函数报错了
    const obj = {
    "0": 1,
    "1": 2,
    "2": 3,
    legnth: 3
    }
    let [num1, num2, num3] = obj;
    console.log(num1, num2, num3); // obj is not iterable

    可以看出,数组解构的对象必须是可迭代的对象

    当想要获取的数组元元素不连续时,则需要将中间元素的值空出来

    const arr = [1, 2, 3, 4, 5];
    const [num1, , num3, , num5];
    console.log(num1, num3, num5); // 1 3 5

解构赋值 Destructuring Assignment的更多相关文章

  1. ES6新特性:利用解构赋值 (destructuring assignment), 简化代码

    本文的Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : 解构赋值是一种表达式, 利用这种新语法, 可以直接从数组或者对象中快速提取值 赋值给不 ...

  2. ECMAScript 6的解构赋值 ( destructuring assignment)

    var provinceValues=["010","020","028","0755","023" ...

  3. ES6解构赋值详解

    文章转载自:http://www.zhufengpeixun.cn/article/167 解构赋值(destructuring assignment)语法是一个 Javascript 表达式,这种语 ...

  4. ES6--变量的声明及解构赋值

    ​ ES6的目标是使得JavaScript语言能够用来编写大型的复杂的应用程序.成为企业级开发语言:该标准已于2015年6月17日正式公布. 可是真正的普及我觉得还得须要一段时间.然而这并非理由让我们 ...

  5. [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)

    [原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...

  6. es6分享——变量的解构赋值

    变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...

  7. 变量的解构赋值////////////z

    变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...

  8. Es6 新增解构赋值

    1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 要想实现解构,就必须是容器,或者具有可遍历的接口. 以前,为 ...

  9. es6 解构赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值 ...

随机推荐

  1. 5种网络IO模型

    5种网络IO模型(有图,很清楚)   同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...

  2. web前端常见面试题

    转载自:https://www.cnblogs.com/jj-z/p/7999538.html 一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起 ...

  3. SpringBoot使用日志

    1.日志框架 日志门面 日志实现 JCL.SLF4J.jboss-logging Log4j.JUL.Log4j2.Logback 日志门面:SLF4J 日志实现:Logback SpringBoot ...

  4. 从零开始搭建Webpack+react框架

    1.下载node.js Node.js官网下载 , 安装: 安装成功后在控制台输入node -v 可查看当前版本: $ node -v v10.15.0 输入npm -v查看npm版本: $ npm ...

  5. [转]imageMagick 在nodejs中报错Error: spawn identify ENOENT的解决方案

    同时还有 Error: Could not execute GraphicsMagick/ImageMagick 这个问题, 也参考了 https://blog.csdn.net/chenxinpen ...

  6. oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法

    之前在调试存储过程时,出现卡死情况,无法插入数据 解决方法 1.查看那些表被锁住: --1.查看那些表被锁住--- select b.owner,b.object_name,a.session_id, ...

  7. learning makefile 模式规则

  8. 将VS项目提交至SVN时,怎样忽略bin和obj目录中的文件

    方法一: 通过设置SVN的Global ignore pattern值. 使用下面的设定值: *.o *.lo *.la *.al .libs *.so *.so.[0-9]**.a *.pyc *. ...

  9. docker 下安装gitlab

    1.找到docker镜像 docker search gitlab 2.下载gitlab镜像 docker pull  gitlab/gitlab-ce/ 3.通常会将 GitLab 的配置 (etc ...

  10. 记录PHP的执行时间

    网上不少误导信息,实际上这个答案在PHP源码中的Zend文件夹下bench.php是有的 在此纠正下网络上复制粘贴造成的错误.希望后来人少踩点坑. function getmicrotime() { ...