深入理解ES6之数据解构的用法


Posted in Javascript onJanuary 13, 2018

一 对象解构

对象解构语法在赋值语句的左侧使用了对象字面量

let node = {
  type: true,
  name: false
}

//既声明又赋值
let {
  type,
  name
} = node;

//或者先声明再赋值
let type, name
({type,name} = node);
console.log(type);//true
console.log(name);//false

type与name标识符既声明了本地变量,也读取了对象的相应属性值。

解构赋值表达式的值为表达式右侧的值。当解构表达式的右侧的计算结果为null或者undefined时,会抛出错误。

默认值

当你使用解构赋值语句时,如果所指定的本地变量在对象中没有找到同名属性,那么该变量会被赋值为undefined

let node = {
  type: true,
  name: false
},
  type, name, value;
({type,value,name} = node);

console.log(type);//true
console.log(name);//false
console.log(value);//undefined

你可以选择性地定义一个默认值,以便在指定属性不存在时使用该值。

let node = {
    type: true,
    name: false
  },
  type, name, value;
({
  type,
  value = true,
  name
} = node);

console.log(type);//true
console.log(name);//false
console.log(value);//true

赋值给不同的本地变量名

let node = {
  type: true,
  name: false,
  value: "dd"
}
let {
  type: localType,
  name: localName,
  value: localValue = "cc"
} = node;
console.log(localType);
console.log(localName);
console.log(localValue);

type:localType这种语法表示要读取名为type的属性,并把它的值存储在变量localType上。该语法与传统对象字面量的语法相反

嵌套的对象结构

let node = {
type: "Identifier",
name: "foo",
loc: {
  start: {
    line: 1,
    column: 1
  },
  end: {
    line: 1,
    column: 4
  }
}
}

let {
loc: localL,
loc: {
  start: localS,
  end: localE
}
} = node;

console.log(localL);// start: {line: 1,column: 1},end: {line: 1,column: 4}
console.log(localS);//{line: 1,column: 1}
console.log(localE);//{line: 1,column: 4}

当冒号右侧存在花括号时,表示目标被嵌套在对象的更深一层中(loc: {start: localS,end: localE})

二 数据解构

数组解构的语法看起来跟对象解构非常相似,只是将对象字面量换成了数组字面量。

let colors = ["red", "blue", "green"];
let [firstC, secondC, thirdC, thursC = "yellow"] = colors;
console.log(firstC//red
console.log(secondC);//blue
console.log(thirdC);//green
console.log(thursC);//yellow

你也可以在解构模式中忽略一些项,并只给感兴趣的项提供变量名。

let colors = ["red","green","blue"];

let [,,thirdC] = colors;
console.log(thirdC);//blue

thirdC之前的逗号是为数组前面的项提供的占位符。使用这种方法,你就可以轻易从数组任意位置取出值,而无需给其他项提供名称。

解构赋值

let colors = ["red","green","blue"],
  firstColor = "black",
  secondColor = "purple";
[firstColor,secondColor] = colors;
console.log(firstColor);//red
console.log(secondColor);//green

数组解构有一个非常独特的用例,能轻易的互换两个变量的值。

let a =1,b =2;
[a,b] = [b,a];
console.log(a);//2
console.log(b);//1

嵌套的解构

let colors = ["red", ["green", "blue"], "yellow"];
let [firstC, [, ssc]] = colors;
console.log(ssc);//blue

剩余项

let colors = ["red", "green", "blue"];
let [firstC, ...restC] = colors;
console.log(firstC);
console.log(...restC);
console.log(restC[0]);//green
console.log(restC[1]);//blue

使用剩余项可以进行数组克隆

let colors = ["red", "green", "blue"];
let [...restC] = colors;
console.log(restC);//["red", "green","blue"]

三 混合解构

let node = {
type: "Identifier",
name: 'foo',
loc: {
  start: {
    line: 1,
    column: 1
  },
  end: {
    line: 1,
    column: 4
  }
},
range: [0, 3]
}

let {
type,
name: localName,
loc: {
  start: {
    line: ll
  },
  end: {
    column: col
  }
},
range: [, second]
} = node;

console.log(type);//Identifier
console.log(localName);//foo
console.log(ll);//1
console.log(col);//4
console.log(second);//3

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
Jan 11 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
Jun 26 Javascript
JS与C#编码解码
Dec 03 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
Feb 26 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
Jun 13 Javascript
Javascript中的arguments对象
Jun 20 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
Mar 09 Javascript
总结javascript三元运算符知识点
Sep 28 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
解决vue addRoutes不生效问题
Aug 04 Javascript
js实现删除json中指定的元素
Sep 22 Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 #Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 #Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 #Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
Jan 12 #Javascript
js 索引下标之li集合绑定点击事件
Jan 12 #Javascript
简单的Vue SSR的示例代码
Jan 12 #Javascript
详解如何在react中搭建d3力导向图
Jan 12 #Javascript
You might like
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
图片按比例缩放函数
2006/06/26 Javascript
javascript下查找父节点的简单方法
2007/08/13 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
python 获取et和excel的版本号
2009/04/09 Python
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
承诺书格式
2014/06/03 职场文书
小型婚礼主持词
2015/06/30 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
Node与Python 双向通信的实现代码
2021/07/16 Javascript
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
MySQL新手入门进阶语句汇总
2022/09/23 MySQL