ES6 解构赋值的原理及运用


Posted in Javascript onMay 25, 2021

数组的解构赋值

let [a, b, c] = [1, 2, 3]

同时定义多个变量,a匹配1、b匹配2、c匹配3

ES6 解构赋值的原理及运用

解构赋值允许指定默认值,即左边变量指定默认值,右边没有对应的值,会优先输出默认值。

let [x, y = 'b'] = ['a'] // x = 'a', y = 'b'

x匹配字符a,y默认值为字符b,若右边没有对应的,默认输出字符b。

对象的解构赋值

解构不仅可以用于数组,还可以用于对象,对象的解构与数组有一个重要的不同,数组的元素是按照次序排列的,变量的取值由它的位置决定的;而对象的属性没有次序,变量必须与属性同名才能取到正确的值。

let {
    name,
    age,
    hobbies: [one, two]
} = {
    name: 'shiramashiro',
    age: 21,
    hobbies: ['骑行', '动漫']
}

比如我取age的值,改成取abc的值,由于没有和对象中的属性名对应,无法对应赋值,所以是undefined。

解构赋值的运用

交换变量的值

正常想到交换变量的值的方式

let x = 1,
    y = 2,
    temp = 0

temp = x // x = 1 = temp
x = y // y = 2 = x
y = temp // temp = 1 = y

console.log('x => ', x)
console.log('y => ', y)

利用解构赋值交换变量

let x = 1;
let y = 2;
[x, y] = [y, x];

console.log('x => ', x)
console.log('y => ', y)

这样交换变量x和y的值,写法不仅简洁,而且易读,语义非常清晰。

从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回,有了解构赋值,就变得更加方便了。

提取hobbies数组中的第二个值

function getArray() {
    return {
        name: 'kongsam',
        age: 21,
        hobbies: ['骑行', '动漫', '羽毛球']
    }
}
console.log(getArray().name + '喜欢' + getArray().hobbies[1]) // 动漫

利用解构赋值获取hobbies数组中的第二个值

let {name, age, hobbies} = getArray()
console.log(name + '喜欢' + hobbies[1]) // 动漫

遍历Map结构

对于for...of循环遍历来说,遍历出来的值是一个数组,而解构赋值对于数组是可以“模式匹配”的,这很快速地取出键-值。

ES6 解构赋值的原理及运用

for...of循环遍历配合解构赋值获取键-值就非常方便。

for (let [key, value] of map) {
    console.log("key => ", key)
    console.log("value => ", value)
}

ES6 解构赋值的原理及运用

函数参数的解构赋值

// let { x = 10, y = 5 } = {}

function f({ x = 10, y = 5 } = {}) {
    return [x, y]
}

console.log(f({ x: 100, y: 50 })) // [100, 50]
console.log(f({ x: 3 })) // [3, 5]
console.log(f({})) // [10, 5]
console.log(f()) // [10, 5]

可以给函数的参数中传入对象,并且可以对传入的对象设置默认值。它将被解构到函数内部里进行使用,你也可以这样理解。

function f(x = 10, y = 5) {
    return [x, y]
}

console.log(f(100, 50)) // [100, 50]
console.log(f(3)) // [3, 5]
console.log(f()) // [10, 5]

上面的写法不一样,也会导致结果不一样

function f({ x, y } = { x: 10, y: 5 }) {
    return [x, y]
}

console.log(f({ x: 100, y: 50 })) // [100, 50]
console.log(f({ x: 3 })) // [3, undefined]
console.log(f({})) // [undefined, undefined]
console.log(f()) // [10, 5]

第三和第四个打印会有undefined,这是因为传入的x或y不对应对象属性中的值,匹配不成功所导致的。

以上就是ES6 解构赋值的原理及运用的详细内容,更多关于ES6 解构赋值的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
代码生成器 document.write()
Apr 15 Javascript
js实现select组件的选择输入过滤代码
Oct 14 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
Aug 27 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
微信小程序  网络请求API详解
Oct 25 Javascript
vue-router 路由基础的详解
Oct 17 Javascript
Vue SSR 组件加载问题
May 02 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
Aug 06 Javascript
vue element实现表格合并行数据
Nov 30 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
AJAX实现省市县三级联动效果
Oct 16 Javascript
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
Ajax请求超时与网络异常处理图文详解
May 23 #Javascript
vue-element-admin项目导入和导出的实现
May 21 #Vue.js
vue2实现provide inject传递响应式
May 21 #Vue.js
You might like
php框架Phpbean说明
2008/01/10 PHP
php 什么是PEAR?
2009/03/19 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
Thinkphp调用Image类生成缩略图的方法
2015/03/07 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
运动检测ViBe算法python实现代码
2018/01/09 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
pygame实现飞机大战
2020/03/11 Python
如何利用python发送邮件
2020/09/26 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
函授大专自我鉴定
2013/11/01 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
大型车展策划方案
2014/02/01 职场文书
股权转让协议范本
2014/12/07 职场文书
2015年商场工作总结
2015/04/27 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL