其他章节请看:

es6 快速入门 系列

解构

我们经常使用数组或对象存储数据,然后从中提取出相关数据信息

试图解决的问题

以前开发者为了从对象或数组中提取出特定数据并赋值给变量,编写了很多重复的代码,就像这样:

function demo1(obj){
let key1 = obj.key1
let key2 = obj.key2
let key3 = obj.key3
let key4 = obj.key4 // 使用key1,key2,key3,key4变量,做进一步操作
} demo1({
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
})

解决的方法

es6引入新特性:解构。来解决上面的问题,请看下面:

function demo1({key1, key2, key3, key4}){
console.log(key2) // value2 // 使用key1,key2,key3,key4变量,做进一步操作
} demo1({
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
})

可以把解构简单理解成赋值

更详细的介绍请看下面补充部分

补充

对象解构

对象解构的语法:在赋值操作符左边放置一个对象字面量

声明变量时使用解构
let obj = {
key1: 'value1',
key2: 'value2'
}
let {key1, key2} = obj console.log(key1) // value1

不要忘记初始化

// 语法错误
var {key1, key2} // 语法错误
let {key1, key2}
变量赋值时使用解构
let obj = {
key1: 'value1',
key2: 'value2'
}
let key1 = '11';
// 一定要用小括号包裹赋值语句。否则js引擎将{}是为代码块,而代码块不允许出现在赋值语句的左侧
({key1} = obj) console.log(key1) // value1
解构时的默认值
let obj = {
key1: 'value1',
key2: 'value2',
key5: undefined
}
let {key1, key2, key3, key4 = 'value4', key5 = 'value5'} = obj console.log(key2) // value2
console.log(key3) // undefined 该变量名在obj中不存在,则赋值undefined
console.log(key4) // value4 对应的属性不存在,使用默认值
console.log(key5) // value5 对应属性值为undefined,使用默认值
非同名变量赋值
let obj = {
key1: 'value1'
}
let {key1: v1, key2: v2 = 'value5'} = obj console.log(v1) // value1
console.log(v2) // value5
嵌套对象的解构
let obj = {
loc: {
key1: 'value1',
}
}
let {loc: {key1, key2, key3 = 'value3'}} = obj; console.log(key1) // value1
console.log(key2) // undefined
console.log(key3) // value3

数组解构

数组解构语法:与对象解构语法相比要简单多了,使用的是数组字面量

声明变量时使用解构
let arr = ['value1', 'value2', 'value3', 'value4', 'value5']
let [,,key3,key4,key5] = arr console.log(key3) // value3 逗号是占位符
console.log(key5) // value5

不要忘记初始化

// 语法错误
let [,,key3,key4,key5]
变量赋值时使用解构

不需要用小括号包裹表达式,这一点与对象解构不同

let arr = ['value1', 'value2']
let key1, key2;
[key1, key2] = arr
console.log(key1) // value1

数组解构有一个独特用法:交换两个变量的值

let key1 = 'value1';
let key2 = 'value2';
[key1, key2] = [key2, key1]; console.log(key1) // value2
console.log(key2) // value1
解构时的默认值
let arr = ['value1']
let [key1, key2 = 'value2'] = arr console.log(key2) // value2
嵌套数组的解构
let arr = ['value1', ['value2', 'value3'], 'value4']
let [key1,[key2],key4] = arr console.log(key2) // value2
console.log(key4) // value4
不定元素

前面我们介绍了不定参数,而在数组解构语法中有一个与之类似的概念:不定元素。在数组中,可以通过三个点(...)的语法将数组中的其余元素赋值给一个特定的变量,就像这样:

let arr = ['value1', 'value2', 'value3', 'value4']
let [key1, ...restKeys] = arr console.log(key1) // value1
console.log(restKeys.length) // 3
console.log(restKeys[0]) // value2

:与不定参数一样,不定元素也必须是最后一个

可以使用不定元素克隆数组

let arr = ['value1', 'value2']
let [...copy] = arr console.log(Array.isArray(copy)) // true
console.log(copy[1]) // value2

解构参数

解构参数必须传值


function demo(key1, {key2, key3}){
console.log(key2) // value2
}
// 正确
demo('value1', {key2: 'value2'})
// 报错
demo('value1')

当调用 demo('value1') 时,js引擎实际上做了这些事:

function demo(key1, options){
let {key2, key3} = options
}

如果需要让解构参数可选,必须为其提供默认值

function demo(key1, {key2, key3} = {}){
console.log(key2) // undefined
} // 正确
demo('value1')

下面这种写法,让解构参数支持可选,并且能提供默认值:

function demo(key1, {key2 = 'value2', key3 = 'value3'} = {}){
console.log(key2)
} demo('value1') // value2 解构参数支持可选
demo('value1', {}) // value2
demo('value1', {key2: 'value20'}) // value20
demo('value1', {key3: 'value30'}) // value2

其他章节请看:

es6 快速入门 系列

es6 快速入门 系列 —— 解构的更多相关文章

  1. es6 快速入门 系列 —— 变量声明:let和const

    其他章节请看: es6 快速入门 系列 变量声明:let和const 试图解决的问题 经典的 var 声明让人迷惑 function demo1(v){ if(v){ var color='red' ...

  2. es6 快速入门 系列 —— promise

    其他章节请看: es6 快速入门 系列 Promise Promise 是一种异步编程的选择 初步认识Promise 用 Promise 来实现这样一个功能:发送一个 ajax,返回后输出 json ...

  3. es6快速入门 系列 - async

    其他章节请看: es6 快速入门 系列 async 前文我们已经知道 promise 是一种异步编程的选择.而 async 是一种用于执行异步任务更简单的语法. Tip:建议学完 Promise 在看 ...

  4. es6 快速入门 系列 —— 类 (class)

    其他章节请看: es6 快速入门 系列 类 类(class)是 javascript 新特性的一个重要组成部分,这一特性提供了一种更简洁的语法和更好的功能,可以让你通过一个安全.一致的方式来自定义对象 ...

  5. es6 快速入门 系列 —— 对象

    其他章节请看: es6 快速入门 系列 对象 试图解决的问题 写法繁杂 属性初始值需要重复写 function createPeople(name, age){ // name 和 age 都写了 2 ...

  6. es6 快速入门 系列

    es6 快速入门(未完结,持续更新中...) 前言 为什么要学习es6 es6对于所有javaScript开发者来说,非常重要 未来,es6将构成javaScript应用程序的基础 es6中很多特性, ...

  7. es6 快速入门 —— 函数

    其他章节请看: es6 快速入门 系列 函数 函数是所有编程语言的重要组成部分,es6之前函数语法一直没什么变化,遗留了许多问题,javaScript开发者多年来不断抱怨,es6终于决定大力度更新函数 ...

  8. python 全栈开发,Day88(csrf_exempt,ES6 快速入门,Vue)

    BBS项目内容回顾 1. 登陆页面 1. 验证码 1. PIL(Pillow) 2. io 2. ORM 1. 增删改查 3. AJAX $.ajax({ url: '', type: '', dat ...

  9. ES6快速入门(二)数据结构

    ES6快速入门 一.解构 1. 对象解构 let person = { name: 'Tang', age: 28 }; //必须同名,必须初始化 let {name, age} = person; ...

  10. vue 快速入门 系列 —— 实例方法(或 property)和静态方法

    其他章节请看: vue 快速入门 系列 实例方法(或 property)和静态方法 在 Vue(自身) 项目结构 一文中,我们研究了 vue 项目自身构建过程,也知晓了 import Vue from ...

随机推荐

  1. Verilog Review

    Agenda 目的 Verilog概述 Verilog建模 模块 模块组成 书写建议 时延 Verilog基本语法 标识符 可读性 注释 空格 数据类型 操作数 运算符 条件语句 循环语句 函数 Ve ...

  2. 【Linux】技术收集

    Linux进程间通信(六)---信号量通信之semget().semctl().semop()及其基础实验 https://blog.csdn.net/mybelief321/article/deta ...

  3. [IDEA] [SpringBoot] 项目所写的内容不能同步到编译出的文件中

    错误原因: 不小心删除了 .yml 导致了,项目所写的内容不能同步到编译出的文件中,之后项目中的任何修改或添加的内容不能同步到编译出的文件中 解决方法 : 文件项目下运行mvn idea:module ...

  4. [转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复

    https://tidb.net/blog/4b5451bb?utm_source=tidb-community&utm_medium=referral&utm_campaign=re ...

  5. [转帖]ck的离线安装

    下载 下载地址: https://repo.clickhouse.tech/tgz/stable/ 下载的包: clickhouse-common-static clickhouse-server c ...

  6. [转帖]使用 TiUP cluster 在单机上安装TiDB

    https://zhuanlan.zhihu.com/p/369414808   TiUP 是 TiDB 4.0 版本引入的集群运维工具,TiUP cluster 是 TiUP 提供的使用 Golan ...

  7. [转帖]sqlserver on linux vs windows

    简单对比下sqlserver on windows与linux的特点,发现新的继续添加 对比项 sqlserver on windows sqlserver on Linux 备注 费用 需要wind ...

  8. [转帖]如何用python连接Linux服务器

    1.安装paramiko库 pip install paramiko 2.使用paramiko库连接linux #导入库 import paramiko 创建一个sshclient对象 ssh = p ...

  9. [转帖]window10下如何安装fio

    1.fio下载地址(实测有效): https://github.com/axboe/fio/releaseshttps://github.com/axboe/fio/releases 其他的地址如​​ ...

  10. 2022 倒带 - NutUI

    作者:京东零售 于明明 前言 时光飞逝,流年似水,让我们倒带 2022,回首这跌宕起伏一年走过的 "升级之路". NutUI 表现如何? 成绩单等着您打分! 2022 是 NutU ...