ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

以前,为变量赋值,只能直接指定值。

let a = 1; let b = 2; let c = 3; 

ES6 允许写成下面这样。

let [a, b, c] = [1, 2, 3]; 

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。

本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。

我认为有用的几个知识点:

  1.数组的解构赋值:

  let [a=3,,c,...rest] = [1,3,5,7,9];

  a  //1

  c  //5

  rest  //[7,9]

  2.对象的解构赋值 -- 关键点:变量名对应对象的属性名

  let {a,b=0,c:{d},e:haha} = {a:1,b:3,c:{d:9},haha:90}

  a  //1

  b  //3

  c  //c是模式,不是变量

  d  //9

  e  //90

3.函数的解构赋值

函数的参数也可以使用解构赋值。

function add([x, y]){ return x + y; } add([1, 2]); // 3 

上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量xy。对于函数内部的代码来说,它们能感受到的参数就是xy

下面是另一个例子。

[[1, 2], [3, 4]].map(([a, b]) => a + b); // [ 3, 7 ] 

函数参数的解构也可以使用默认值。

function move({x = 0, y = 0} = {}) { return [x, y]; } move({x: 3, y: 8}); // [3, 8] move({x: 3}); // [3, 0] move({}); // [0, 0] move(); // [0, 0] 

上面代码中,函数move的参数是一个对象,通过对这个对象进行解构,得到变量xy的值。如果解构失败,xy等于默认值。

注意,下面的写法会得到不一样的结果。

function move({x, y} = { x: 0, y: 0 }) { return [x, y]; } move({x: 3, y: 8}); // [3, 8] move({x: 3}); // [3, undefined] move({}); // [undefined, undefined] move(); // [0, 0]

用途

变量的解构赋值用途很多。

(1)交换变量的值

let x = 1; let y = 2; [x, y] = [y, x]; 

上面代码交换变量xy的值,这样的写法不仅简洁,而且易读,语义非常清晰。

(2)从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

// 返回一个数组function example() { return [1, 2, 3]; } let [a, b, c] = example();  // 返回一个对象 function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example(); 

(3)函数参数的定义

解构赋值可以方便地将一组参数与变量名对应起来。

// 参数是一组有次序的值
function f([x, y, z]) { ... } f([1, 2, 3]);  // 参数是一组无次序的值 function f({x, y, z}) { ... } f({z: 3, y: 2, x: 1}); 

(4)提取JSON数据

解构赋值对提取JSON对象中的数据,尤其有用。

let jsonData = {id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number); // 42, "OK", [867, 5309] 

上面代码可以快速提取 JSON 数据的值。

(5)函数参数的默认值

jQuery.ajax = function (url, { async = true, beforeSend = function () {}, cache = true, complete = function () {}, crossDomain = false, global = true,  // ... more config }) {  // ... do stuff }; 

指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || 'default foo';这样的语句。

(6)遍历Map结构

任何部署了Iterator接口的对象,都可以用for...of循环遍历。Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值就非常方便。

var map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for (let [key, value] of map) { console.log(key + " is " + value); } // first is hello // second is world 

如果只想获取键名,或者只想获取键值,可以写成下面这样。

// 获取键名
for (let [key] of map) {  // ... }  // 获取键值 for (let [,value] of map) {  // ... } 

(7)输入模块的指定方法

加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

const { SourceMapConsumer, SourceNode } = require("source-map"); 

转载于:https://www.cnblogs.com/hackerPJ/p/7538417.html

es6学习 -- 解构赋值相关推荐

  1. ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗?

    本文来源于知乎上的一个提问. 为了程序的易读性,我们会使用 ES6 的解构赋值: function f({a,b}){} f({a:1,b:2}); 这个例子的函数调用中,会真的产生一个对象吗?如果会 ...

  2. ES6常用解构赋值有哪几种?

    ES6常用解构赋值有哪几种? a.数组的解构赋值 //数组解析赋值,模式匹配 {let [a, b, c] = [1, 2, 3];console.log("模式匹配");cons ...

  3. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries......

    2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法,  后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法:  1.         定义变 ...

  4. ES6中解构赋值深入解读

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 1.数组的解构赋值 let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail ...

  5. ES6语法---解构赋值

    解构赋值概念 按照一定的模式,从数组和对象中提取值,对变量进行赋值,就被称为解构. 目的是为了提高效率,使用起来更加方便. 以下的各个说明,我会类比着ES5去解释,希望能帮到小伙伴们. 数组解构 正常 ...

  6. 前端面试不用怕!一分钟带你了解es6的解构赋值

    解构赋值(★★★)!!!!! ES6中允许从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构 <script>var stus=['李钟硕','刘诗诗','易烊千玺']//访问数 ...

  7. ES6:解构赋值及对象方法

    解构赋值 对象解构 起别名:通过:来进行取名 //对象解构赋值 var obj = { uname: "张三", age: 21, sex: "男" } // ...

  8. Vue学习笔记(三)Vue2三种slot插槽的概念与运用 | ES6 对象的解构赋值 | 基于Vue2使用axios发送请求实现GitHub案例 | 浏览器跨域问题与解决

    文章目录 一.参考资料 二.运行环境 三.Vue2插槽 3.1 默认插槽 3.2 具名插槽 3.3 作用域插槽 ES6解构赋值概念 & 作用域插槽的解构赋值 3.4 动态插槽名 四.GitHu ...

  9. es6 - 解构赋值

    一 我们为什么要使用解构 在学习ES6新的特性解构赋值之前,我们先来看看为什么要使用解构,以前如果我们需要获取对象或者数组里面的数据,并且把它们存入数组,需要写很多代码.如下 const person ...

最新文章

  1. const那些事-初始化
  2. linux nginx postgresql php,常用Web环境架设手册PNP:Postgresql+Nginx+PHP
  3. Bean放入Spring容器,你知道几种方式?
  4. Linux安装mongodb数据库最新版(全网最细)
  5. 使用Highcharts实现柱状图展示
  6. 1w存银行一年多少利息_一百万存银行一年利息多少?提前取出利息怎么算?
  7. liunx下安装redis开启网络
  8. Mac编译OpenJDK8:configure: error: Xcode 4 is required to build JDK 8, the version found was 10.1config
  9. Java中IO演练之银行账号校验
  10. android 高仿ios开关,Android 仿苹果IOS6开关按钮
  11. 放大镜旋转 css,css3中仿放大镜效果的几种方式原理解析
  12. vs 设置起始页不见了_VS2015,为什么模板不见了,请教
  13. app跳转到指定app
  14. 计算机组成原理菊花链是什么,计算机组成原理试题解析8
  15. 【GamePlay】Unity手机屏幕UI适配问题
  16. iPhone下mp4视频无法播放和部分手机只有声音没有画面
  17. Worthington胰蛋白酶解决方案
  18. handle与HWND的差别
  19. lucas定理、拓展lucas定理学习小结
  20. mapper文件报错:corresponds to your MySQL server version for the right syntax to use near ‘)VALUES( ‘

热门文章

  1. C++ 字符串中小写字母转换成大写字母
  2. 【消息中间件】Spring整合RabbitMQ
  3. java基础第十一篇之Date、Math、自动装箱和拆箱
  4. Spring 基于xml配置方式的AOP
  5. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践
  6. 用 Python脚本生成 Android SALT 扰码
  7. easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条)
  8. Codeforces Round #503 (by SIS, Div. 1)D. the hat
  9. php cli模式下获取参数的方法
  10. linux用终端上传文件和文件家到远程的服务器