其他章节请看:

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. ORA-00947:Not enough values (没有足够的值)

    1.问题 2.解决方式 大概率是关系表实际列数大于你所填的元素个数,请检查是否有疏漏的列即可. 我这里是以为代理键直接忽略不写即可,没有标明具体插入列,但是还是得标明才行 --创建图书目录表TITLE ...

  2. STM32CubeMX教程22 FSMC - 8080并行接口TFT-LCD驱动

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...

  3. Java基础篇(05):函数式编程概念和应用

    目录 一.函数式概念 二.函数与方法 三.JDK函数基础 1.Lambda表达式 2.函数式接口 四.Optional类 1.Null判断 2.Optional应用 五.Stream流 一.函数式概念 ...

  4. Shell-基本

  5. [转帖] Linux命令拾遗-使用blktrace分析io情况

    https://www.cnblogs.com/codelogs/p/16060775.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 一般来说,想检 ...

  6. [转帖]Linux设备与内存单位-扇区、块、段、页(sector、block、segment、page)

    每个概念是对不同的对象而言的,但它们有一定的联系 这些概念的分析背景是Linux下的内存页和磁盘结构 扇区 是硬盘等存储设备传送单位,大小一般为512B 块 是VFS和文件系统的传送单位(所以相关设备 ...

  7. [转帖]新一代垃圾回收器ZGC的探索与实践

    1. 引入 1.1 GC之痛 很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰. GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停 ...

  8. [转帖]TCP/IP RFC

    TCP/IP RFC-阿里云开发者社区 TCP/IP 标准是在一系列称为 RFC 的文档中发布的.RFC 是目前仍在发展的描述 TCP/IP 和 Internet 内部工作的一系列报告.协议的提议以及 ...

  9. node使用nodemailer发送邮件

    安装模块 npm install nodemailer 代码 const nodemailer = require('nodemailer'); // 查找到有关QQ邮箱的相关信息在 /node_mo ...

  10. js中toFixed 并不是你想的那样进行四舍五入

    toFixed 的简单介绍 toFixed() 方法可把 Number 类型的数字通过四舍五入为指定小数位的字符串.(将数字类型转化为字符串类型) 也就是说toFixed只能够处理数字类型的. 字符串 ...