位置: IT常识 - 正文

ES6 --- 解构赋值(数组,对象,函数)使用详解(es6解构赋值对象)

编辑:rootadmin
ES6 --- 解构赋值(数组,对象,函数)使用详解 解构赋值

推荐整理分享ES6 --- 解构赋值(数组,对象,函数)使用详解(es6解构赋值对象),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:es6解构赋值是浅拷贝,es6解构赋值 剩余,es6解构赋值数组对象,es6解构赋值是浅拷贝,es6解构赋值是浅拷贝,es6解构赋值有哪几种,es6解构赋值是浅拷贝,es6解构赋值是浅拷贝,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript 中最常用的两种数据结构是 Object 和 Array。

对象让我们能够创建通过键来存储数据项的单个实体。数组则让我们能够将数据收集到一个有序的集合中。

但是,当我们把它们传递给函数时,函数可能不需要整个对象/数组。它可能只需要对象/数组的一部分。

解构赋值 是一种特殊的语法,它使我们可以将数组或对象“拆包”至一系列变量中,因为有时这样更方便。

解构操作对那些具有很多参数和默认值等的函数也很奏效。我们马上会看到类似的例子。

数组解构

下面是一个将数组解构到变量中的例子:

// 我们有一个存放了名字和姓氏的数组let arr = ["John", "Smith"]// 解构赋值// sets firstName = arr[0]// and surname = arr[1]let [firstName, surname] = arr;alert(firstName); // Johnalert(surname); // Smith

现在我们就可以针对这些变量进行操作,而不是针对原来的数组元素。

当与 split 函数(或其他返回值是数组的函数)结合使用时,看起来就更优雅了:

let [firstName, surname] = "John Smith".split(' ');alert(firstName); // Johnalert(surname); // Smith

正如我们所看到的,语法很简单。但是有几个需要注意的细节。让我们通过更多的例子来加深理解。

“解构”并不意味着“破坏”

这种语法叫做“解构赋值”,因为它通过将结构中的各元素复制到变量中来达到“解构”的目的。但数组本身是没有被修改的。

这只是下面这些代码的更精简的写法而已:

// let [firstName, surname] = arr;let firstName = arr[0];let surname = arr[1];

忽略使用逗号的元素

数组中不想要的元素也可以通过添加额外的逗号来把它丢弃:

// 不需要第二个元素let [firstName, , title] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];alert( title ); // Consul

在上面的代码中,数组的第二个元素被跳过了,第三个元素被赋值给了 title 变量,数组中剩下的元素也都被跳过了(因为在这没有对应给它们的变量)。

等号右侧可以是任何可迭代对象

……实际上,我们可以将其与任何可迭代对象一起使用,而不仅限于数组:

let [a, b, c] = "abc"; // ["a", "b", "c"]let [one, two, three] = new Set([1, 2, 3]);

这行得通,因为在内部,结构赋值是通过迭代右侧的值来完成工作的。这是一种用于对在 = 右侧的值上调用 for..of 并进行赋值的操作的语法糖。

赋值给等号左侧的任何内容

我们可以在等号左侧使用任何“可以被赋值的”东西。

例如,一个对象的属性:

let user = {};[user.name, user.surname] = "John Smith".split(' ');alert(user.name); // Johnalert(user.surname); // Smith

与 .entries() 方法进行循环操作

在前面的章节中我们已经见过了 Object.entries(obj) 方法。

我们可以将 .entries() 方法与解构语法一同使用,来遍历一个对象的“键—值”对:

let user = { name: "John", age: 30};// 循环遍历键—值对for (let [key, value] of Object.entries(user)) { alert(`${key}:${value}`); // name:John, then age:30}

用于 Map 的类似的代码更简单,因为它是可迭代的:

let user = new Map();user.set("name", "John");user.set("age", "30");// Map 是以 [key, value] 对的形式进行迭代的,非常便于解构for (let [key, value] of user) { alert(`${key}:${value}`); // name:John, then age:30}

交换变量值的技巧

有一个著名的使用结构赋值来交换两个变量的值的技巧:

let guest = "Jane";let admin = "Pete";// 让我们来交换变量的值:使得 guest = Pete,admin = Jane[guest, admin] = [admin, guest];alert(`${guest}${admin}`); // Pete Jane(成功交换!)ES6 --- 解构赋值(数组,对象,函数)使用详解(es6解构赋值对象)

这里我们创建了一个由两个变量组成的临时数组,并且立即以交换了的顺序对其进行了解构。

我们可以用这种方式交换两个以上的变量。

其余的 ‘…’

通常,如果数组比左边的列表长,那么“其余”的数组项会被省略。

例如,这里只取了两项,其余的就被忽略了:

let [name1, name2] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];alert(name1); // Juliusalert(name2); // Caesar// 其余数组项未被分配到任何地方

如果我们还想收集其余的数组项 —— 我们可以使用三个点 "..." 来再加一个参数以获取“其余”数组项:

let [name1, name2, ...rest] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];// rest 是包含从第三项开始的其余数组项的数组alert(rest[0]); // Consulalert(rest[1]); // of the Roman Republicalert(rest.length); // 2

rest 的值就是数组中剩下的元素组成的数组。

不一定要使用变量名 rest,我们也可以使用任何其他的变量名,只要确保它前面有三个点,并且在解构赋值的最后一个参数位置上就行了。

let [name1, name2, ...titles] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];// 现在 titles = ["Consul", "of the Roman Republic"]默认值

如果数组比左边的变量列表短,这里也不会出现报错。缺少的值被认为是 undefined:

let [firstName, surname] = [];alert(firstName); // undefinedalert(surname); // undefined

如果我们想要一个“默认”值给未赋值的变量,我们可以使用 = 来提供:

// 默认值let [name = "Guest", surname = "Anonymous"] = ["Julius"];alert(name); // Julius(来自数组的值)alert(surname); // Anonymous(默认值被使用了)

默认值可以是更加复杂的表达式甚至可以是函数调用,这些表达式或函数只会在这个变量未被赋值的时候才会被计算。

举个例子,我们使用了 prompt 函数来提供两个默认值:

// 只会提示输入姓氏let [name = prompt('name?'), surname = prompt('surname?')] = ["Julius"];alert(name); // Julius(来自数组)alert(surname); // 你输入的值

请注意:prompt 将仅针对缺失值(surname)运行。

对象解构

解构赋值同样适用于对象。

基本语法是:

let {var1, var2} = {var1:…, var2:…}

在等号右侧应该有一个已经存在的对象,我们想把它拆分到变量中。等号左侧包含了对象相应属性的一个类对象“模式(pattern)”。在最简单的情况下,等号左侧的就是 {...} 中的变量名列表。

举个例子:

let options = { title: "Menu", width: 100, height: 200};let {title, width, height} = options;alert(title); // Menualert(width); // 100alert(height); // 200

属性 options.title、options.width 和 options.height 值被赋给了对应的变量。

变量的顺序并不重要,下面这个代码也奏效:

// 改变 let {...} 中元素的顺序let {height, width, title} = { title: "Menu", height: 200, width: 100 }

等号左侧的模式(pattern)可以更加复杂,并且指定了属性和变量之间的映射关系。

如果我们想把一个属性赋值给另一个名字的变量,比如把 options.width 属性赋值给名为 w 的变量,那么我们可以使用冒号来设置变量名称:

let options = { title: "Menu", width: 100, height: 200};// { sourceProperty: targetVariable }let {width: w, height: h, title} = options;// width -> w// height -> h// title -> titlealert(title); // Menualert(w); // 100alert(h); // 200

冒号表示“什么值:赋值给谁”。上面的例子中,属性 width 被赋值给了 w,属性 height 被赋值给了 h,属性 title 被赋值给了同名变量。

对于可能缺失的属性,我们可以使用 "=" 设置默认值,如下所示:

let options = { title: "Menu"};let {width = 100, height = 200, title} = options;alert(title); // Menualert(width); // 100alert(height); // 200

就像数组或函数参数一样,默认值可以是任意表达式甚至可以是函数调用。它们只会在未提供对应的值时才会被计算/调用。

在下面的代码中,prompt 提示输入 width 值,但不会提示输入 title 值:

let options = { title: "Menu"};let {width = prompt("width?"), title = prompt("title?")} = options;alert(title); // Menualert(width); // (prompt 的返回值)

我们还可以将冒号和等号结合起来:

let options = { title: "Menu"};let {width: w = 100, height: h = 200, title} = options;alert(title); // Menualert(w); // 100alert(h); // 200

如果我们有一个具有很多属性的复杂对象,那么我们可以只提取所需的内容:

let options = { title: "Menu", width: 100, height: 200};// 仅提取 title 作为变量let { title } = options;alert(title); // Menu剩余模式(pattern)"…"

如果对象拥有的属性数量比我们提供的变量数量还多,该怎么办?我们可以只取其中的某一些属性,然后把“剩余的”赋值到其他地方吗?

我们可以使用剩余模式(pattern),就像我们对数组那样。一些较旧的浏览器不支持此功能(例如,使用 Babel 对其进行填充),但可以在现代浏览器中使用。

看起来就像这样:

let options = { title: "Menu", height: 200, width: 100};// title = 名为 title 的属性// rest = 存有剩余属性的对象let {title, ...rest} = options;// 现在 title="Menu", rest={height: 200, width: 100}alert(rest.height); // 200alert(rest.width); // 100

不使用 let 时的陷阱

在上面的示例中,变量都是在赋值中通过正确方式

本文链接地址:https://www.jiuchutong.com/zhishi/300786.html 转载请保留说明!

上一篇:2022最全最新前端面试题(附加解答)(20221年最新)

下一篇:openprompt使用记录:分类,生成案例(openprop教程)

  • 隐藏app怎么弄出来(隐藏app怎么弄出来的)

    隐藏app怎么弄出来(隐藏app怎么弄出来的)

  • 苹果x短信长按不出特效(苹果x短信长按没反应)

    苹果x短信长按不出特效(苹果x短信长按没反应)

  • 原装线可能不支持此配件(原装线可能不支持快充吗)

    原装线可能不支持此配件(原装线可能不支持快充吗)

  • 2020抖音用户有多少亿人(抖音用户数2021)

    2020抖音用户有多少亿人(抖音用户数2021)

  • 联想复印机7400显示更换墨粉盒怎么办(联想复印机7400加墨视频)

    联想复印机7400显示更换墨粉盒怎么办(联想复印机7400加墨视频)

  • 充电器的头特别烫手怎么办(充电器的头特别烫)

    充电器的头特别烫手怎么办(充电器的头特别烫)

  • 抖音地理位置自动变吗(抖音地址位置)

    抖音地理位置自动变吗(抖音地址位置)

  • 6s听筒声音小要修吗

    6s听筒声音小要修吗

  • 手机上面显示hd1是什么意思(手机显示hd是什么意思)

    手机上面显示hd1是什么意思(手机显示hd是什么意思)

  • 小米10充电时如何显示(小米10充电时如何显示小数点)

    小米10充电时如何显示(小米10充电时如何显示小数点)

  • oppo远程守护怎么显示不了对方地理位置(oppo远程守护怎么突然没有了)

    oppo远程守护怎么显示不了对方地理位置(oppo远程守护怎么突然没有了)

  • thinkpad是联想的品牌吗(thinkpad算联想吗)

    thinkpad是联想的品牌吗(thinkpad算联想吗)

  • 监控显示器显示无信号(监控显示器显示超频怎么办)

    监控显示器显示无信号(监控显示器显示超频怎么办)

  • iphone x用的什么基带(iphonex用的什么电池)

    iphone x用的什么基带(iphonex用的什么电池)

  • 怎样删除电脑上的小象壁纸(怎样删除电脑上的文件)

    怎样删除电脑上的小象壁纸(怎样删除电脑上的文件)

  • 京东spu是什么意思(京东sop是什么意思)

    京东spu是什么意思(京东sop是什么意思)

  • word怎么设置角标(word怎么设置)

    word怎么设置角标(word怎么设置)

  • 来电语音提示是什么(手机电话语音来电提示)

    来电语音提示是什么(手机电话语音来电提示)

  • 美柚里的周期什么意思(美柚上的周期是什么意思)

    美柚里的周期什么意思(美柚上的周期是什么意思)

  • ip地址告诉别人有事吗(ip地址能不能告诉别人)

    ip地址告诉别人有事吗(ip地址能不能告诉别人)

  • word怎么生成二维码(word文档生成二维码)

    word怎么生成二维码(word文档生成二维码)

  • 如何查找手机nfc功能(如何查找手机定位)

    如何查找手机nfc功能(如何查找手机定位)

  • 一加7是水滴屏吗(一加7水滴屏怎么关)

    一加7是水滴屏吗(一加7水滴屏怎么关)

  • win7系统便签删除确认提示框不见的解决方法(windows7便签删除了怎么恢复)

    win7系统便签删除确认提示框不见的解决方法(windows7便签删除了怎么恢复)

  • csrss32.exe是病毒程序吗 是安全进程吗 csrss32进程查询(srv.exe病毒)

    csrss32.exe是病毒程序吗 是安全进程吗 csrss32进程查询(srv.exe病毒)

  • 印花税申报是含税收入还是不含税收入
  • 种植茶叶企业所得税怎么征收
  • 准予扣除的职工福利费
  • 个人经营贷款利率是多少
  • 应交增值税进项税额转出借贷方向表示什么
  • 固定资产认证进项在勾选平台勾吗
  • 小规模纳税人企业所得税怎么计算
  • 停车费要交税吗
  • 怎样查询单位上月社保缴纳情况
  • 当月工资额什么意思
  • 低税负销售激励策略的设计与案例!
  • 两个公司领工资会不会合并纳税
  • 个税计提比实际缴纳多怎么办
  • 出租房产业务企业所得税如何处理?
  • 代付租金委托书怎么写
  • 房产税发票可以抵扣吗
  • 增值税清卡失败f50006
  • 鸿蒙系统怎么开启开发者权限
  • 电脑折旧率计算公式
  • 销售出库未开票怎么入账
  • 吉隆坡石油双塔有多高
  • 房地产企业将开发产品抵押后再销售
  • php字符串操作函数
  • 前端页面出现乱码
  • 股份有限公司向股东借款
  • 房企因商品质量问题退租
  • element栅格布局
  • 资产减值损失会影响利润总额吗
  • php动态读取数据的代码
  • 有利润但不交企业所得税
  • 在vue中获取dom元素
  • vue组件元素设置滚动条高度
  • 终止cat命令
  • zip命令详解
  • 企业所得税中哪些属于免税收入
  • 预收账款是否要缴纳增值税
  • 建筑行业销售材料怎么做
  • python中的函数库
  • 生产辅助
  • 理财产品分红和收益
  • 营业收入的构成分析应该从哪些方面进行?
  • 小规模第一次申报流程
  • 业务招待费专票可以抵扣吗
  • 临时工工资无发票可以扣除吗
  • 营业收入的核算方式有哪些
  • 应交增值税进项税额转出账务处理
  • 企业股权融资方式有哪些
  • 公司账户的钱如何转出
  • 补偿性余额实际利率计算公式
  • 租赁动迁补偿条款
  • 疫情期间水电费补贴收入申报企业所得税吗
  • 租地青苗补偿问题
  • 长期借款和长期贷款一样吗
  • 本月无收入还用结转吗
  • 工会经费是什么凭证
  • mysql内存占用一直增高不释放
  • mysql 5.7.16 zip包安装配置方法图文教程
  • mysql80安装配置教程
  • linux系统中用户密码保存在什么文件中
  • linux sshd是什么
  • window10的dns异常
  • win7经常自动重启是什么原因
  • Win10系统如何开启全部权限
  • skydrive官网登录
  • window如何删除输入法
  • 新版itunes怎么导入音乐
  • 苹果预计10.1-15号到能准确吗
  • win 8系统怎么样
  • linux命令文件移动
  • opengl 绘制
  • jquery移动节点的方法
  • python入门100例
  • Android studio 打包apk后卡在首屏
  • javascript $符号
  • json格式例子
  • 现在小规模开专票多少钱
  • 税务坚定理想信念心得体会
  • 中华人民共和国道路交通安全法
  • 上海疫情租房金额怎么算
  • 城市维护建设税的计税依据
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设