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 相关文章推荐
JQuery 简便实现页面元素数据验证功能
Mar 24 Javascript
基于JQuery的动态删除Table表格的行和列的代码
May 12 Javascript
jquery事件与函数的使用介绍
Sep 29 Javascript
使用Sticker.js实现贴纸效果
Jan 28 Javascript
jquery使用animate方法实现控制元素移动
Mar 27 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
jquery动态创建div与input的实例代码
Oct 12 Javascript
js判断一个字符串是以某个字符串开头的简单实例
Dec 27 Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 Javascript
p5.js入门教程之小球动画示例代码
Mar 15 Javascript
对VUE中的对象添加属性
Sep 18 Javascript
详解React中合并单元格的正确写法
Jan 08 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
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
js中判断控件是否存在
2010/08/25 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
Python单链表简单实现代码
2016/04/27 Python
Python三级菜单的实例
2017/09/13 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Python try except else使用详解
2021/01/12 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
人事经理岗位职责范本
2014/08/04 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
机器人瓦力观后感
2015/06/12 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技