深入理解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 相关文章推荐
一些主流JS框架中DOMReady事件的实现小结
Feb 12 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
Sep 02 Javascript
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
Javascript常用字符串判断函数代码分享
Dec 08 Javascript
每天一篇javascript学习小结(基础知识)
Nov 10 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
Nov 03 Javascript
JS判断时间段的实现代码
Jun 14 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 Javascript
详解如何使用webpack打包JS
Jun 21 Javascript
浅谈webpack+react多页面开发终极架构
Nov 11 Javascript
JS中FileReader类实现文件上传及时预览功能
Mar 27 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
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
python实现的udp协议Server和Client代码实例
2014/06/04 Python
Django中的Model操作表的实现
2018/07/24 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
python读取mysql数据绘制条形图
2020/03/25 Python
印尼网上商店:Alfacart.com
2019/03/11 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
安全生产责任书
2014/03/12 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
餐馆开业致辞
2015/08/01 职场文书
月考总结与反思
2015/10/22 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
MySQL慢查询的坑
2021/04/28 MySQL
Vue的生命周期一起来看看
2022/02/24 Vue.js