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 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
Jun 23 Javascript
jquery 简单图片导航插件jquery.imgNav.js
Mar 17 Javascript
caller和callee的区别介绍及演示结果
Mar 10 Javascript
关于js遍历表格的实例
Jul 10 Javascript
node.js require() 源码解读
Dec 13 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
Aug 23 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
Aug 08 Javascript
浅谈angular2路由预加载策略
Oct 04 Javascript
vue数据传递--我有特殊的实现技巧
Mar 20 Javascript
js实现拾色器插件(ColorPicker)
May 21 Javascript
简单了解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 get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
javascript操作css属性
2013/12/30 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
python面试题小结附答案实例代码
2019/04/11 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
Python @property装饰器原理解析
2020/01/22 Python
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
教师党员思想汇报
2014/01/06 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
单位委托书格式范本
2014/09/29 职场文书
公司人事任命通知
2015/04/20 职场文书
2015年项目工作总结
2015/04/29 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS