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 相关文章推荐
自适应图片大小的弹出窗口
Jul 27 Javascript
JQuery 学习笔记 选择器之一
Jul 23 Javascript
在IE下获取object(ActiveX)的Param的代码
Sep 15 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 Javascript
浅谈下拉菜单中的Option对象
May 10 Javascript
javascript数据结构之串的概念与用法分析
Apr 12 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
javascript防抖函数debounce详解
Jun 11 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
jquery实现拖拽小方块效果
Dec 10 jQuery
Canvas跟随鼠标炫彩小球的实现
Apr 11 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高级OOP技术演示
2009/08/27 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
2017/11/30 Javascript
vue多次循环操作示例
2019/02/08 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
python实现定时播放mp3
2015/03/29 Python
Python读取网页内容的方法
2015/07/30 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
Python3多线程操作简单示例
2018/05/22 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
HTML5图片预览实例分享
2014/06/04 HTML / CSS
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
CAD制图人员的自荐信
2014/02/07 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
在js中修改html body的样式
2021/11/11 Javascript
SpringBoot Http远程调用的方法
2022/08/14 Java/Android