ES6数组与对象的解构赋值详解


Posted in Javascript onJune 14, 2019

本文实例讲述了ES6数组与对象的解构赋值。分享给大家供大家参考,具体如下:

数组的解构赋值

基本用法

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

// 以前为变量赋值,只能直接指定值
var a = 1;
var b = 2;
var c = 3;
// ES6允许写成这样
var [a,b,c] = [1,2,3];

本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

下面是一些使用嵌套数组进行解构的例子:

let [foo,[[bar],baz]] = [1,[[2],3]];
foo // 1
bar // 2
baz // 3
let [,,third] = ["foo","bar","baz"];
third // "baz"
let [head,...tail] = [1,2,3,4];
head // 1
tail // [2,3,4]
let [x,y,...z] = ['a'];
x // "a"
y // undefined
z // []

默认值

解构赋值允许制定默认值

var [foo = true] = [];
foo // true
[x,y='b'] = ['a'];
// x='a', y='b'

注意,ES6内部使用严格相等运算符(===),判断一个位置是否有值。

所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。

var [x=1] = [undefined];
x //1
var [x=1] = [null];
x // null

如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值:

function f(){
 console.log('aaa');
}
let [x=f()] = [1];

上面的代码中,因为x能取到值,所以函数f()根本不会执行。上面的代码其实等价于下面的代码:

let x;
if([1][0] === undefined){
 x = f();
}else{
 x = [1][0];
}

默认值可以引用解构赋值的其他变量,但该变量必须已经声明:

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

上面最后一个表达式,因为x用到默认值是y时,y还没有声明。

对象的解构赋值

解构不仅可以用于数组,还可以用于对象

var {foo,bar} = {foo:"aaa",bar:"bbb"};
foo // "aaa"
bar // "bbb"

对象的解构和数组有一个重要的不同。数组的元素是按此排序的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

var {bar,foo} = {foo:"aaa",bar:"bbb"};
foo // "aaa"
bar // "bbb"
var {baz} = {foo:"aaa",bar:"bbb"};
baz // undefined

如果变量名与属性名不一致,必须写成这样:

var {foo:baz} = {foo:"aaa",bar:"bbb"};
baz // "aaa"
let obj = {first:"hello",last:"world"};
let {first:f,lats:l} = obj;
f // "hello"
l // "world"

对象的解构赋值是内部机制,是先找到同名属性,然后再赋给对应的变量。

真正被赋值的是后者,而不是前者。

var {foo:baz} = {foo:"aaa",bar:"bbb"};
baz // "aaa"
foo // error: foo is not defined

上面的代码中, foo是匹配的模式, baz才是变量。真正被赋值的是变量baz,而不是模式foo。

和数组一样,解构也可以用于嵌套解构的对象

var obj = {
 p:["hello",{y:"world"}]
};
var {p:[x,{y}]} = obj;
x // "hello"
y // "world"

注意,这时p是模式,不是变量,因此不会被赋值。

对象的解构也可以指定默认值:

var {x=3} = {};
x // 3
var {x,y=5} = {x:1};
x // 1
y // 5
var {x: y=3} = {x: 5};
y // 5

如果解构失败,变量的值等于undefined

var {foo} = {bar:"baz"};
foo // undefined

如果解构模式是嵌套的对象,并且子对象所在的父属性不存在,那么会报错:

// 报错
var {foo: {bar}} = {baz:"baz"};

由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构:

var arr = [1,2,3];
var {0:first, [arr.length-1]:last} = arr;
first // 1
last // 3

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
Mar 01 Javascript
使用firebug进行调试javascript的示例
Dec 16 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 Javascript
JS实现的颜色实时渐变效果完整实例
Mar 25 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
详解Web使用webpack构建前端项目
Sep 23 Javascript
iview日期控件,双向绑定日期格式的方法
Mar 15 Javascript
vue debug 二种方法
Sep 16 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
Vue实现滑动拼图验证码功能
Sep 15 Javascript
Node配合WebSocket做多文件下载以及进度回传
Nov 07 Javascript
Vue详细的入门笔记
May 10 Vue.js
简单了解Ajax表单序列化的实现方法
Jun 14 #Javascript
通过JS深度判断两个对象字段相同
Jun 14 #Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 #Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 #Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
Jun 14 #Javascript
Vue动态创建注册component的实例代码
Jun 14 #Javascript
基于Proxy的小程序状态管理实现
Jun 14 #Javascript
You might like
PHP+javascript液晶时钟
2006/10/09 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
yii框架builder、update、delete使用方法
2014/04/30 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Python贪心算法实例小结
2018/04/22 Python
python实现黑客字幕雨效果
2018/06/21 Python
python判断数字是否是超级素数幂
2018/09/27 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
运动会致辞稿50字
2014/02/04 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
入党积极分子群众意见
2015/06/01 职场文书
小学新课改心得体会
2016/01/22 职场文书
Nginx动静分离配置实现与说明
2022/04/07 Servers