勇宝趣学JavaScript ES6第二章(解构赋值)

ES6中,我们经常使用到解构赋值这个知识点,今天我们就来好好讲讲这一小部分知识点。咱们争取这回一次性讲明白。

今天是元宵节,祝大家节日快乐,只有我自己还在无聊的码字。

给我点个赞吧,嘿嘿!!!

在这里插入图片描述

文章目录

  • 一、数组的解构赋值
    • 1.1 基本用法
    • 1.2 解构原理
    • 1.3 设置默认值
  • 二、对象的解构赋值
    • 2.1 基本用法
    • 2.2 对象解构过程
    • 2.3 设置默认值
  • 三、字符串的解构赋值
    • 3.1 基本用法
  • 四、函数参数的解构赋值
    • 4.1 参数默认值
  • 五、闲聊

一、数组的解构赋值

ES6允许我们对一个数组或者是对象从中进行取值,然后在对变量进行赋值的这个操作叫做解构。

1.1 基本用法

  1. 在以前,我们是这样对变量进行赋值的

    let a = 1;
    let b = 2;
    let c = 3;
    
  2. 然而在ES6中,我们可以书写成以下方式:

    let [a, b, c] = [1, 2, 3]console.log(a, b, c); // 1 2 3
    

这种写法有一个专业术语,叫做模式匹配。其实我更喜欢叫映射(一一对应)。

  1. 还有嵌套结构的写法

    let [a, [b, c], d] = ['JavaScript', ['Vue', 'React'], 'Node'];console.log(a, b, c, d); // JavaScript Vue React Node
    
  2. 如果我们想获取数组的某一个下标的值可以这样写:

    let [, [, a], b] = ['JavaScript', ['Vue', 'React'], 'Node'];console.log(a, b); // React Node
    
  3. 通过...可以获取到剩余值

    let [a, ...b] = ['JavaScript', 'Vue', 'React', 'Node'];console.log(a); // JavaScript
    console.log(b); // ['Vue', 'React', 'Node']
    
  4. 如果解构不成功,首先不会报错,控制台会打印undefined

    let [a, b] = ['Javascript'];console.log(b); // undefined
    
  5. 解构也可以是不完全解构,不比如我们只用到数组的第一项。

    let [a] = ['JavaScript', 'vue', 'Node'];console.log(a); // JavaScript
    

1.2 解构原理

  1. 我们来简单说一下,为什么数组和对象可以解构,根本原因是我们的对象有Interator接口

    let web = ['JavaScript', 'Vue'];console.log(web.__proto__);
    

在这里插入图片描述

有了这个接口,我们还可以对数组或对象进行遍历。

拓展:在ES6中SetMap也是可以解构和遍历的。

1.3 设置默认值

  1. 解构允许我们设置一个默认值,当我们取不到值的时候就会显示默认值

    let [first, second = 'iyongbao' ] = ['Daven'];console.log(first, second); // Daven iyongbao
    
  2. 注意如果数组的某一项是undefined,那么也会启用默认值。而null是正常赋值的。

    let [a, b = 'Vue', c] = ['JavaScript', undefined, null];console.log(a, b, c); // JavaScript Vue null
    
  3. 这里我给大家出一道面试题,大家看看会打印什么?

    let [x = y, y = 1] = [];console.log(x, y); // ??? 
    

为什么会这样呢?欢迎评论区告诉我。

二、对象的解构赋值

2.1 基本用法

  1. 解构不仅适用于数组,也适用于对象。但是二者有一个很明显的区别。先把结论和说一下:数组是有序的,而对象可以是无序的,因为对象是一个个键值对(key=>value)

    解构数组变量的取值由数组的位置来决定,解构对象需要变量名和对象属性一致才能取到正确的值。

    // 第一种写法
    // let { username, age } = { username: 'iyongbao', age: 26 };// 第二种:顺序可以颠倒,但是值不会变
    let { age, username, hobbys } = { username: 'iyongbao', age: 26, hobby: 'Vue' };console.log(username, age, hobbys); // iyongbao 26 
    console.log(hobby); // undefined
    
  2. 如果我就想变量名和对象属性名不一样,也是可以操作的。

    let { age: aaa } = { username: 'iyongbao', age: 26 };console.log(aaa); // iyongbao
    console.log(age); // 报错:ReferenceError: age is not defined
    
  3. 和数组一样,对象也是支持嵌套解构的

    let { userInfo: { hobby }} = { userInfo: { name: 'iyongbao', age: 26, hobby: ['Vue', 'React'] } };console.log(hobby); // ['Vue', 'React']
    

    这其实就是对象的多次解构

2.2 对象解构过程

我们来聊一聊这个解构赋值的过程是怎么样的。

let { username: username } = { username: 'iyongbao', age: 26 };
  1. 解构: 程序会去{ username: 'iyongbao', age: 26 }对象中找属性为username的值;
  2. 赋值:找到后赋值给我们声明name变量,因为ES6特性,如果值一样,我们可以省略
  3. 所以说真正被赋值是后者不是前者

所以总结出为什么报错,age是匹配的模式,aaa才是真正的变量。

2.3 设置默认值

  1. 和数组一样,解构对象也是可以设置默认值的,大同小异。

    let { color = 'red' } = {};
    let { name, age = 26 } = { name: 'iyongbao' }console.log(color, name, age); // red iyongbao 26
    

注意:默认值生效条件是获取的值为undefined

let { color = 'red' } = { color: undefined };let { background = 'green' } = { background: null };console.log(color, background); // red null

三、字符串的解构赋值

3.1 基本用法

  1. 字符串也是可以进行解构赋值的,编辑器会把字符串转换为一个类似数组对象

    let [a, b, c, d, e, f, g] = 'iyongbao';console.log(a, b, c, d, e, f, g); // i y o n g b a
    
  2. 我们也可以解构出来字符串长度

    let { length } = 'iyongbao';console.log(length); // 8
    

    为什么会这样:首先程序包装我们的字符串为一个实例对象,让这个实例去访问指定的属性或方法,然后获取对象中的length,最后销毁自己。(其实String在底层字符串是以字符数组的形式保存的。)

四、函数参数的解构赋值

函数参数也是可以进行解构赋值

function add ([x, y]) {return x + y;
}console.log(add([1, 2])); // 3

4.1 参数默认值

  1. 可以给参数设置默认值(第一种)

    function foo ({ x = 1, y = 2}) {return [x, y];
    }foo({ x: 3, y: 4}); // [3, 4]
    foo({ x: 5 }); // [5, 2]
    foo({}); // [1, 2]
    

上面的函数需要传入一个对象,通过解构赋值得到对应的值,如果解构失败则使用默认值

  1. 可以给参数设置默认值(第二种)

    function foo ({ x, y } = { x: 1, y: 2}) {return [x, y];
    }foo({ x: 1, y: 2}); // [1, 2]
    foo({ x: 3 }); // [3, undefined]
    foo({}); // [undefined, undefined]
    foo(); // [1, 2]
    

这种赋值注意是整体赋值只要我们传入参数默认值不起作用了。

思考:看一看一下会打印什么值:

let newArr = [1, undefined, 2].map((x = 'iyongbao') => x);console.log(newArr); // ???

五、闲聊

本来想的是码完字去写写代码,维护一下网站,可是写完发现已经快要11点了,今天也是元宵节,就饶过自己,好好睡一觉。真心希望我写的东西能让更多的人看到,也真心希望我写的东西能帮助到一些人,虽然很基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2808359.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库进阶第四篇(视图/存储过程/触发器)

文章目录 一、视图简单介绍与基础语法二、视图的检查选项三、视图的更新四、视图的作用五、存储过程的概念与特点六、存储过程的 创建,调用,查看,删除七、存储过程 — 系统变量八、存储过程 — 用户定义变量九、存储过程 — 局部变量十、存储…

acwing算法学习笔记 ------ 双链表

1、定义 这里可以做一个投机取巧,我们不再像单链表去用head去存头和尾,直接让r[0] 1,l[1] 0; idx 2.进行初始化, 解释一下l[N] 和 r[N] l[N]:是表示指向左面下一个节点下标, r[N]:表示指向下一个节点的下标。大家不用担心i…

[VNCTF2024]-PWN:shellcode_master解析(orw,用mmap代替read读文件)

查看保护 查看ida 在sandbox函数中,函数先使用了seccomp_init初始化,允许了所有系统调用,再用seccomp_rule_add来禁用掉了部分系统调用,其中包括execve和read seccomp_init函数可以进行系统调用全禁用和全允许初始化 seccomp_ru…

《高质量的C/C++编程规范》学习

目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…

python_pyecharts绘制漏斗图

python-pyecharts绘制漏斗图 from pyecharts.charts import Funnel from pyecharts import options as opts# 数据 data [("访问", 100), ("咨询", 80), ("订单", 60), ("点击", 40), ("展现", 20)]# 创建漏斗图 funnel …

uvloop,一个强大的 Python 异步IO编程库!

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 什么是uvloop库? 安装uvloop库 使用uvloop库 uvloop库的功能特性 1. 更…

【信息提取】FindSomething 浏览器插件

下载地址 FindSomething 浏览器插件 概述 在网页的源代码或js中找到一些有趣的东西 FindSomething 用于快速在网页的html源码或js代码中提取一些有趣的信息,包括可能请求的资源、接口的url,可能请求的ip和域名,泄漏的证件号、手机号、邮箱…

程序员可以做什么副业呢?

如果你经常玩知乎、看公众号(软件、工具、互联网这几类的)你就会发现,好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如:天涯神贴,基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下,迅雷…

2024年云南事业单位报名流程!明天就开始报名啦,千万不要错过哦

注意啦!注意啦!2024年云南事业单位报名即将开始! ▶️公告已发布,2月26日上午9:00开始报名‼️ 相关时间节点 **报名时间:**2024年2月26日9:00至3月1日18:00 **资格初审时间:**2024年2月26日…

【Python】Windows本地映射远程Linux服务器上的端口(解决jupyter notebook无法启动问题)

创作日志: 学习深度学习不想在本地破电脑上再安装各种软件,我就用实验室的服务器配置环境,启动jupyter notebook时脑子又瓦特了,在自己Windows电脑上打开服务器提供的网址,那肯定打不开啊,以前在其它电脑上…

【服务发现--service】

1、service的定义 "Service"简写"svc”。Pod不能直接提供给外网访问,而是应该使用service。Service就是把Pod暴露出来提供服务,Service才是真正的“服务”,它的中文名就叫“服务”。可以说Service是一个应用服务的抽象&#…

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码,这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码,可以给你提供快捷方便的校园生活,有很多有趣实用的板块和功能,如:闲置交易、表白交友、疑问互答、任务兼职…

C++ //练习 8.9 使用你为8.1.2节(第281页)第一个练习所编写的函数打印一个istringstream对象的内容。

C Primer(第5版) 练习 8.9 练习 8.9 使用你为8.1.2节(第281页)第一个练习所编写的函数打印一个istringstream对象的内容。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*****…

NATS学习笔记(一)

NATS是什么? NATS是一个开源的、轻量级、高性能的消息传递系统,它基于发布/订阅模式,由Apcera公司开发和维护。 NATS的功能 发布/订阅:NATS的核心是一个发布/订阅消息传递系统,允许消息生产者发布消息到特定的主题…

制作ai语音助手

目录 一、总体介绍 二、唤醒 http://t.csdnimg.cn/3mf18 三、将语音唤醒和aiui结合 (1)项目合并 (2)修改CMakeList.txt (3)demo代码修改 1.添加库 2.在demo中添加唤醒功能的代码 3.尝试运行代码&am…

【数据结构和算法初阶(c语言)】数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)

1.何为数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。本质来讲就是在内存中去管理数据方式比如我们的增删查改。在内存中管理数据的方式有很多种(比如数组结构、链式结构、树型结…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解,基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型,源代码放在GitHub上,地址传送点击此处。项目大纲如下: 文章目录 一、问题描述二、数据集处理…

智能SQL生成:后端技术与LLM的完美结合

文章目录 引言一、什么是大模型二、为什么选择LLM三、开发技术说明四、系统架构说明五、编码实战1. Maven2. 讯飞大模型配置类3. LLM相关的封装4. 编写LLM的service5. 编写controller6. 运行测试 六、总结 引言 本篇文章主要是关于实现一个类似Chat2DB的根据自然语言生成SQL的…

新改进!基于改进粒子群算法的微网/综合能源系统多目标优化调度程序代码!

适用平台:MatlabYalmipCplex 程序提出了一种综合考虑微电网系统运行成本和环境保护成本的并网模式下微电网多目标优化调度模型,采用改进的粒子群算法对优化模型进行求解。程序算例丰富、注释清晰、干货满满,可扩展性和创新性很高&#xff01…

readproc.h

Ubuntu22.04系统中 编译自己写的程序的时候,报错,显示找不到readproc.h文件,通过安装libprocps-dev解决 sudo apt install libprocps-dev