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实现全国省份城市级联下拉菜单效果代码
Sep 07 Javascript
一起学写js Calender日历控件
Apr 14 Javascript
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
jquery根据一个值来选中select下的option实例代码
Aug 29 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
jquery实现弹窗功能(窗口居中显示)
Feb 27 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
Oct 25 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
vue中axios实现数据交互与跨域问题
May 12 Javascript
Javascript confirm多种使用方法解析
Sep 25 Javascript
JavaScript使用setTimeout实现倒计时效果
Feb 19 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中使用Oracle数据库(3)
2006/10/09 PHP
PHP脚本的10个技巧(7)
2006/10/09 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
nginx下安装php7+php5
2016/07/31 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
python在指定目录下查找gif文件的方法
2015/05/04 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
python最长回文串算法
2018/06/04 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
七一党建活动方案
2014/01/28 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
医院院务公开实施方案
2014/05/03 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2015年端午节活动总结
2015/02/11 职场文书
python文件目录操作之os模块
2021/05/08 Python
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
Redis如何实现分布式锁
2021/08/23 Redis