其他章节请看:

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. Angular系列教程之观察者模式和RxJS

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. 用C# WPF简单实现仪表控件

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  3. vscode - Prettier插件 统一代码风格规范,保存自动格式化代码

    安装 Prettier - Code formatter prettier安装完毕,使用shift+alt+f就可格式化代码. 如果需要自动保存,要在系统设置中增加"editor.forma ...

  4. Asp.Net core 自定义 appsettings.json 文件路径

    builder.Host.ConfigureAppConfiguration((hostingContext, config) => { config.AddJsonFile("d:/ ...

  5. [转帖]Nginx 安全优化

    目录 前言 1.使用 SSL/TLS 证书 2.使用安全密钥交换机制 3.禁用旧的 SSL/TLS 协议 4.禁用 SSL/TLS 弱密码套件 5.禁用不需要的 HTTP 方法 6.防止缓冲区溢出攻击 ...

  6. 汉字在unicode的编码情况-From http://yedict.com/zsts.htm

    字符集内容 字数 unicode编码 字符显示说明(除非安装更大字库) 基本区  分页:  一 二 三 四 共20902字 4E00-9FA5 电脑和手机都能显示 基本区补充 共90字 9FA6-9F ...

  7. [转帖]Strong crypto defaults in RHEL 8 and deprecation of weak crypto algorithms

    https://access.redhat.com/articles/3642912   TABLE OF CONTENTS What policies are provided? Removed c ...

  8. [转帖]Linux命令(51)——ipcs命令

    https://cloud.tencent.com/developer/article/1380589 1.命令简介 ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表.共享 ...

  9. [转帖]jmeter线程组与循环次数的区别

    在压测的时候,有些接口需要携带登录信息,但是我们只想登录一次,然后其他接口进行多用户压测,此时你会怎么办?用仅一次控制器实现吗?下面我们来看看用仅一次控制器能不能实现 压测时jmeter中的线程数是模 ...

  10. [转帖]Jmeter脚本录制:Jmeter5.0脚本录制

    第一部分进行jmeter设置 第一步:在JMeter中添加线程组 第二步:在线程组下添加HTTP请求默认值 添加->配置元件->HTTP请求默认值,设置服务器IP和端口号 第三步:在线程组 ...