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 相关文章推荐
js技巧--转义符"\"的妙用
Jan 09 Javascript
YUI 读码日记之 YAHOO.lang.is*
Mar 22 Javascript
在JavaScript并非所有的一切都是对象
Apr 11 Javascript
js简单实现HTML标签Select联动带跳转
Oct 23 Javascript
ExtJS判断IE浏览器类型的方法
Feb 10 Javascript
详解vue之页面缓存问题(基于2.0)
Jan 10 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
解析Vue 2.5的Diff算法
Nov 28 Javascript
Angular4学习之Angular CLI的安装与使用教程
Jan 04 Javascript
vue组件间通信六种方式(总结篇)
May 15 Javascript
js函数和this用法实例分析
Mar 13 Javascript
Vue实现简单计算器
Jan 20 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正则表达式(regar expression)
2011/09/10 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
JS分页效果示例
2013/10/11 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Cpy和Python的效率对比
2015/03/20 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
物业客服专员岗位职责
2013/11/30 职场文书
出国英文推荐信
2014/05/10 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers
Vue router配置与使用分析讲解
2022/12/24 Vue.js