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 相关文章推荐
CSS+Jquery实现页面圆角框方法大全
Dec 24 Javascript
那些年,我还在学习jquery 学习笔记
Mar 05 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
Jan 22 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
Node.js中require的工作原理浅析
Jun 24 Javascript
javascript版2048小游戏
Mar 18 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
jQuery实现布局高宽自适应的简单实例
May 28 Javascript
详解Vue使用命令行搭建单页面应用
May 24 Javascript
浅谈layer弹出层按钮颜色修改方法
Sep 11 Javascript
vue实现简单瀑布流布局
May 28 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
简单了解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转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
python中map、any、all函数用法分析
2015/04/21 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
python图片验证码生成代码
2016/07/02 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
化学教师自荐信范文
2013/12/28 职场文书
家长对小学生的评语
2014/01/28 职场文书
《火烧云》教学反思
2014/04/12 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
爱护草坪标语
2014/06/24 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript