【ES6基础】解构赋值(destructuring assignment)

2023-05-16

我们经常可以在其他编程语言(如GO语言)中看到多返回值这种特性,因为在很多实际场景中,函数的返回值中,函数的返回值并不只有一个单一的值。ES6之前,并没有可以直接使用语法来实现多返回值的特性。ES6终于出现了解构赋值的语法糖来解决此类问题。

解构赋值是一种表达式,允许您使用数组或对象,将可迭代对象的值或属性分配给变量。解构赋值能让我们用更简短的语法进行多个变量的赋值,大大的减少了代码量。解构表达式有两种:array和object。

今天的文章笔者将从以下方面进行介绍:

  • 使用数组表达式解构赋值
    • 常规用法
    • 忽略数组中的某些值
    • 使用展开语法
    • 默认参数值
    • 嵌套数组解构
    • 作为函数参数
  • 使用对象表达式解构赋值
    • 常规用法
    • 默认参数值
    • 嵌套对象
    • 作为函数参数
  • 其他
    • 解构对象的方法
    • 获取字符串长度
    • 拆分字符串
    • 交换变量
    • 遍历Map结构
    • 加载指定模块的方法
  • 常用场景介绍

本篇本章阅读时间预计15分钟

使用数组表达式解构赋值

常规用法

如何将一个数组的值,赋值给多个变量?数组解构语法能让我们快速的迭代数组的元素,并赋值给多个变量。

E6之前,我们可以这种形式将数组的内容赋值给多个变量:

var myArray = [1, 2, 3];
var a = myArray[0];
var b = myArray[1];
var c = myArray[2];复制代码

ES6后,我们可以通过数组解构语法,在一行语句里完成上述操作。

let myArray = [1, 2, 3];
let a, b, c;
[a, b, c] = myArray; //array destructuring assignment syntax复制代码

上述代码中,[a, b, c]就是解构表达式。在数组解构语句的左侧就是需要进行赋值的多个变量,等号右侧则是我们需要分配的值。

我们还可以让上述代码更短,你还可以这么写,代码如下:

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

我们在同一行语句中创建变量,而不是分别创建。是不是更清爽。

如果左边的数值少于右边数组的项数,左边变量的值只会和右边数组的内容一一对应,多于的内容将会忽略。

忽略数组中某些值

如果只有两个变量,我们数组内容有三项,我们想跳过数组中的第二项,我们如何使用数组解构赋值呢?代码如下:

let [a, , b] = [1, 2, 3];
console.log(a);
console.log(b);复制代码

上述代码我们使用, ,忽略数组中的第二项,建议中间有空格,方便我们阅读。

使用展开语法

上篇文章《【ES6基础】展开语法(Spread syntax)》,笔者介绍了展开语法的几个应用场景,由于上篇文章没介绍解构赋值,所以在这里给大家介绍展开语法在解构赋值的应用。如下段代码所示:

let [a, ...b] = [1, 2, 3, 4, 5, 6];
console.log(a);
console.log(Array.isArray(b));
console.log(b);”复制代码

上述代码则会输出:

1
true
2,3,4,5,6复制代码

上述代码,你可以看到b变量被解构赋值成数组,这里...就是我们上篇文章提到的剩余参数场景的运用。

如果想跳过数组中的部分值,我们可以这么做,如下段代码所示:

let [a, , ,...b] = [1, 2, 3, 4, 5, 6];
console.log(a);
console.log(b);复制代码

上述代码则会输出:

1
456复制代码

这段代码我们跳过了数组的第2项和第3项。

默认参数值

笔者在《【ES6基础】默认参数值》给大家介绍了如何使用默认参数值,在解构赋值中,我们如何设置变量的默认值呢,如下段代码所示:

let [a, b, c = 3] = [1, 2];
console.log(c); //Output "3”复制代码

嵌套数组

我们还可以从多维数组中提取值并分配给变量,如下段代码所示:

let [a, b, [c, d]] = [1, 2, [3, 4]];复制代码

作为函数参数

我们还可以使用数组解构表达式作为函数参数来提取可迭代数组的值,作为参数传递给函数参数,如下段代码所示:

function myFunction([a, b, c = 3]) {
     console.log(a, b, c); //Output "1 2 3"
   }
myFunction([1, 2]);复制代码

笔者在《【ES6基础】默认参数值》提及到我们可以传递undefined,指定某个具体的参数使用默认值,我们可以使用结构赋值为相关变量提供一组默认值,并传入undefined,如下段代码所示:

function myFunction([a, b, c = 3] = [1, 2, 3]) {
     console.log(a, b, c);  //Output "1 2 3"
   }
myFunction(undefined);复制代码

在这里,我们将undefined作为参数传递,因此使用默认数组[1,2,3]进行提取赋值。

使用对象表达式解构赋值

常规用法

对象解构赋值将对象属性的值赋给多个变量。ES6之前我们可以这样把对象的属性赋值给多个变量,如下段代码所示:

var object = {name : "John", age : 23};
var name = object.name;
var age = object.age;复制代码

在ES6里,我们可以使用对象解构表达式,在单行里给多个变量赋值,如下段代码所示:

let object = {name : "John", age : 23};
let name, age;
({name, age} = object); //object destructuring assignment syntax复制代码

对象解构赋值的左侧为解构赋值表达式,右侧为对应要分配赋值的对象。解构语句的两边千万不要遗漏左右括号(),否则会报错。

还有一点需要格外注意,解构对象变量的名称一定要和右边对象的属性名称保持一致,否则会提示变量的值为undefined。如果你想以其它的变量名进行命名,你可以这么做,如下段代码所示:

let object = {name : "John", age : 23};
let x, y;
({name: x, age: y} = object);复制代码

上述代码x,y为对应对象属性的值John,23。如果你输出name或age,编译器则会提示ReferenceError: 变量 is not defined

我们可以让代码更短,如下段代码所示:

let {name: x, age: y} = {name : "John", age : 23};复制代码

上述代码由于声明变量和解构赋值在同一行,因此对象解构语句两边无需左右括号()。

默认参数值

在解构对象针对未分配值的变量,我们可以为变量提供默认值,如下段代码所示:

let {a, b, c = 3} = {a: "1", b: "2"};
console.log(c); //Output "3”复制代码

在解构对象时变量名支持表达式计算,如下段代码所示:

let {["first"+"Name"]: x} = { firstName: "Eden" };
console.log(x); //Output "Eden”复制代码

嵌套对象

我们还可以从嵌套对象中提取属性值,即对象中的对象。 如下段代码所示:

let {name, otherInfo: {age}} = {name: "Eden", otherInfo: {age:23}};
console.log(name, age); //Eden 23复制代码

作为函数参数

就像数组解构赋值一样,我们也可以使用对象解构赋值作为函数参数,如下段代码所示:

function myFunction({name = 'Eden', age = 23, profession ="Designer"} = {}){
    console.log(name, age, profession); // Outputs "John 23 Designer"
}
myFunction({name: "John", age: 23});复制代码

在这里,我们传递一个空对象作为默认参数值,如果将undefined作为函数参数传递,变量将使用默认值。

其他

解构对象的方法

比如结构Math对象的方法,如下段代码所示:

let {floor,pow}=Math;//把Math里的方法提取出来变成一个变量
let a=1.1;
console.log(floor(a));//1
console.log(pow(2,3));//8复制代码

获取字符串的长度

var {length}='lxy';
console.log(length);//3复制代码

拆分字符串

var [a,b,c,d]='前端达人';
console.log(a,b,c,d) // 输出:前 端 达 人复制代码

交换变量

let x = 1;
let y = 2;
[x, y] = [y, x];复制代码

遍历Map结构

var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');

for (let [key, value] of map) {
    console.log(key + " is " + value);
}复制代码

加载指定模块的方法

const { SourceMapConsumer, SourceNode } = require("source-map");复制代码

常用场景介绍

比如我们经常与后端API接口做数据交互,我们需要处理返回的JSON对象,使用解构方式大大简化了我们的代码,如下段代码所示:

let jsonData = {
    id: 42,
    status: "OK",
    data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]复制代码

小节

今天的内容有些多,想必大家对解构赋值有了全面的认识吧,使用解构赋值是不是很强大,大大简化了我们的代码量,虽然优势蛮多,但是增加对代码的理解难度,我们只有在实践中不断的运用,来加深我们对解构赋值的认识。

ES6相关文章

【ES6基础】let和作用域

【ES6基础】const介绍

【ES6基础】默认参数值

【ES6基础】展开语法(Spread syntax)

更多精彩内容,请微信关注”前端达人”公众号!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ES6基础】解构赋值(destructuring assignment) 的相关文章

  • Element ui中menu组件(el-menu/el-menu-item/el-submenu/template) 层级结构和用法

    此篇文章写下的时间是2020年 所以如今Element UI都更新了不知道多少版了 肯定会有些许变化 请勿完全照搬照抄 虽然可能这部分代码没什么大的变动 但还是要以官方文档为准 此文仅仅是借鉴 理解具体思路 然后再按照官方的例子来应用到自己
  • 【JS 构造

    个人格言 时间是亳不留情的 它真使人在自己制造的镜子里照见自己的真相 Git专栏 Git篇 JavaScript专栏 js实用技巧篇 该专栏持续更新中 目的是给大家分享一些常用实用技巧 同时巩固自己的基础 共同进步 欢迎前来交流 你的一键三
  • 上拉加载原理

    实现思路 之前写过一篇触底加载 经过一番苦学钻研 优化一下 样式方面 滚动区域是给固定高度 设置 overflow y auto 来实现 接下来看看js方面的实现 其实也很简单 触发的条件是 可视高度 滚动距离 gt 实际高度 例子我会使用
  • 前端基础(三)- ES7~ES12

    为了方便记忆和称呼 ES2015之后的新知识点我们都统称ES6语法 就没必要去划分得那么细 ES7 2016 Array prototype includes includes方法可以判断一个数组是否包含某个指定的值 如果存在返回true
  • 如何忽略数组解构中的某些返回值?

    当我只对索引 0 之外的数组值感兴趣时 在数组解构时是否可以避免声明无用的变量 在下文中 我想避免声明a 我只对索引 1 及以后感兴趣 How can I avoid declaring a const a b rest 1 2 3 4 5
  • 在哪里可以获取有关 JavaScript 函数的对象参数语法的信息?

    如果我想调用这样的函数 moo a 4 通常我必须这样表述我的函数定义 function moo myArgObj print myArgObj a 但是这个很棒的语法在 Spidermonkey 中用于定义函数是完全有效的 functio
  • 将变量列表单独传递给 clojure 函数

    我一直在使用 clojure 并决定创建一个结合了 mapcat 和 list 的高阶函数来模拟这种行为 Clojure gt mapcat list 1 2 3 4 5 6 7 8 1 5 2 6 3 7 4 8 我的第一次尝试是定义 m
  • 对解构函数参数感到困惑

    在下面的示例中 为什么 whois 函数可以访问 displayName2 和 name1 function whois displayName displayName2 fullName firstName name1 console l
  • 从对象(日期对象)解构函数

    如果我想破坏一个对象我会这样做 const obj a a fn gt some function const fn obj fn OR const a fn obj console log fn 这不适用于Date目的 未捕获的类型错误
  • ES6 面试题 | 13.精选 ES6 面试题

    前端开发工程师 主业 技术博主 副业 已过CET6 阿珊和她的猫 CSDN个人主页 牛客高级专题作者 在牛客打造高质量专栏 前端面试必备 蓝桥云课签约作者 已在蓝桥云课上架的前后端实战课程 Vue js 和 Egg js 开发企业级健康管理
  • VUE实践优化:轮询机制与代码结构升级

    前言 我们之前探讨过 对于包含处理状态的表格数据 我们可以通过轮询的方式进行处理 轮询更新进度条 JavaScript中的定时器和异步编程技巧 然而 当我们离开页面时 定时器仍会继续触发请求 这会造成资源的浪费 因为返回的数据并没有被渲染出
  • ES6:用符号作为键解构对象

    我有一个包含符号作为键的对象 在这种情况下我该如何进行解构赋值 let symbol Symbol let obj symbol let how do I create a variable here that holds the valu
  • 解构 Clojure 函数的参数,同时保留原始值。

    您可以解构函数参数但仍然可以使用原始参数吗 我现在做的方法就是使用letform 在函数体内 但我想知道是否有更简洁的方法来做到这一点 似乎 as也适用于函数 with vector defn test x y as v x x y y v
  • ES6 是否存在用于将对象属性的子集复制到新对象的简写? [复制]

    这个问题在这里已经有答案了 考虑以下对象 const obj a 1 b 2 c 3 d 4 e 5 是否有一个简单的语法来创建包含以下内容的新对象 const obj2 a b d 我知道下划线和 lodash 有 pick 但我希望存在
  • 有没有办法部分解构结构?

    我有一个结构 struct ThreeDPoint x f32 y f32 z f32 我想要提取两个实例化后的三个属性 let point ThreeDPoint ThreeDPoint x 0 3 y 0 4 z 0 5 let Thr
  • 用于将对象的属性列入白名单的对象解构({ x, y, ...rest })[重复]

    这个问题在这里已经有答案了 Using 对象剩余解构 https github com sebmarkbage ecmascript rest spread blob master Rest md将对象的属性列入黑名单很简单 如下例所示 c
  • 为什么解构赋值不知道空值是假值并使用默认值? [复制]

    这个问题在这里已经有答案了 假设我们有一个函数使用参数内部对象中的一些键 const api data name gt My name is name 如果我们通过 data data 0 data NaN or data undefine
  • 在 ECMA 第 3 阶段使用提案在统计上是否安全?

    背景 我指的是 操作员 许多人喜欢并支持执行以下操作的想法 const obj hello 1 const obj2 world 2 obj Problem 与典型的语法相比 我个人更喜欢这种语法Object assign但最近当我开始在我
  • 解构对象作为函数参数

    不太明白这个参数const Posts以下 我对 Node React 还很陌生 它是解构的参数对象吗 或者它只是作为参数传递的对象 getPosts 和 post 显示为未定义 但我不明白参数对象是从哪里传递到函数中的 完整代码在这里 h
  • 将对象解构为数组

    我有这个对象 const foo a kitten b puppy c lion 将其解构为变量就像这样 const a b c foo 是否有一个简单的方法如何将其解构为数组 以便结果是 const array a b c 据我所知 没有

随机推荐

  • ros:出现:error: ros/ros.h: No such file or directory

    出现这个问题是因为在cmakelist txt中没有声明对roscpp的依赖 在find package中添加roscpp 重新执行就ok了 转载于 https www cnblogs com fuhang p 9934092 html
  • IOS-如何优雅地拦截按钮事件(判断是否需要登录)

    关于这个标题 xff0c 起因是这样的 最近一次做项目需求时 xff0c 遇到这样一个需求 xff0c 就是本来我们App是必须注册或者第三方登录才可以使用 xff0c 现在希望不登录也可以浏览App里面的内容 xff0c 只是在需要的时候
  • postman安装使用教程---图文讲解

    一 安装postman 1 xff0c 安装包安装 官网下载地址 https www getpostman com 选择好对应的版本下载 下载完后直接安装 2 xff0c 插件包安装 可以在谷歌的应用商店里面找到 或者在网上下载 准备了一个
  • ArUco----一个微型现实增强库的介绍及视觉应用(一)

    ArUco 一个微型现实增强库的介绍及视觉应用 xff08 一 xff09 ArUco 一个微型现实增强库的介绍及视觉应用 xff08 一 xff09 一 ArUco简介 ArUco是一个开源的微型的现实增强库 xff0c 目前好像已经集成
  • matlab 图像基本矩阵,MATLAB基本的使用方法归纳(图像,矩阵及函数)

    读取图像 xff1a 用imread函数读取图像文件 xff0c 文件格式可以是TIFF JPEG GIF BMP PNG等 比如 gt gt f 61 imread 39 chestxray jpg 39 读进来的图像数据被保存在变量f中
  • VR直播云服务解决方案

    VR直播 通过VR xff08 虚拟现实 xff09 技术 xff0c 用户通过佩戴相关硬件设备 xff0c 通过平台提供的APP进行直播观看 主播需采用360 全景的拍摄设备 xff0c 捕捉多角度画面 xff0c 进行多画面传输后 xf
  • VirtualBox快照(Snapshot)功能使用及注意事项

    这几天在使用QT编写一个ARM的图形化应用程序 xff0c 需要在PC端使用linux下的QtCreator 搭建环境神马的还是挺麻烦的一个过程 依照我的风格 xff0c 这么麻烦的东西一定不要重复做第二遍 剧透下 xff0c 最后还是很悲
  • docker学习笔记11:Dockerfile 指令 CMD介绍

    我们知道 xff0c 通过docker run 创建并启动一个容器时 xff0c 命令的最后可以指定容器启动后在容器内立即要执行的指令 xff0c 如 xff1a docker run i t ubunu bin bash 表示容器启动时立
  • 麦克纳姆轮运动学分析

    麦克纳姆轮运动学分析 是最常见的安装方式 麦轮底盘的正逆运动学模型 以O 长方形的安装方式为例 xff0c 四个轮子的着地点形成一个矩形 正运动学模型 xff08 forward kinematic model xff09 将得到一系列公式
  • 传小米秘密自研操作系统mios 将应用于小米4(

    http tieba baidu com f kw 61 E5 8D 97 E4 BA AC E8 85 8B E8 87 AD E5 8C BB E9 99 A2 E3 80 90 E5 92 A8 E8 AF A2QQ EF BC 9A
  • OV2SLAM 安装运行

    OV2SLAM 安装运行 1 安装依赖项1 1 安装 OpenGV1 2 安装OV2SLAM 2 运行 OV2SLAM2 1 运行EUROC数据集2 2 运行KITTI数据集 参考资料 OV2SLAM 1 是2021年新开源出来的单目 43
  • IMU助力无人机自主精准着陆

    一盒用户急需的药品由无人机配送到小区中 xff0c 一键下单10分钟热气腾腾的外卖随着无人机送到家门口 这不是科幻作品中才有的景象 xff0c 而是已经实现的场景 但在实际应用中 xff0c 无人机配送还存在着预估位移不准确 着陆偏差过大等
  • Maven自动FTP远程部署

    参照官网文档 xff1a https maven apache org plugins maven deploy plugin examples deploy ftp html 1 在pom xml中加入 xff1a lt project
  • 面试感悟----一名3年工作经验的程序员应该具备的技能

    原文地址http www cnblogs com xrq730 p 5260294 html xff0c 转载请注明出处 xff0c 谢谢 xff01 前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结 xff0c 因此有了这
  • c语言菜单经典实例

    include lt conio h gt include lt dos h gt include lt graphics h gt include lt stdio h gt include lt stdlib h gt 定义一些常数 d
  • Docker(二):微服务教程

    Docker 是一个容器工具 xff0c 提供虚拟环境 很多人认为 xff0c 它改变了我们对软件的认识 站在 Docker 的角度 xff0c 软件就是容器的组合 xff1a 业务逻辑容器 数据库容器 储存容器 队列容器 xff0c Do
  • 让进程在后台可靠运行的几种方法

    Linux 技巧 xff1a 让进程在后台可靠运行的几种方法 想让进程在断开连接后依然保持运行 xff1f 如果该进程已经开始运行了该如何补救 xff1f 如果有大量这类需求如何简化操作 xff1f 我们经常会碰到这样的问题 xff0c 用
  • 小米路由器mini拆解,附上独家对MT7620A见解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 小米路由mini采用单核MT7620A处理器 xff0c 搭配128MB DDR3 xff0c 内置智能家居控制中心 xff0c 和标准版一样提供2x2双频天线 xff0c
  • 采购收货的异常

    仓库发OA过来 xff0c 说有一票采购订单收货的时候提示红灯错误 xff0c 截图如下 xff1a 双击错误消息 xff0c 提示该消息是出自于M7429 百度 xff0c 没有相关资料 问群里 xff0c 也没人懂 于是通过 H 来查看
  • 【ES6基础】解构赋值(destructuring assignment)

    我们经常可以在其他编程语言 如GO语言 中看到多返回值这种特性 xff0c 因为在很多实际场景中 xff0c 函数的返回值中 xff0c 函数的返回值并不只有一个单一的值 ES6之前 xff0c 并没有可以直接使用语法来实现多返回值的特性