ES6解构对象、数组、函数传参

news2024/11/28 16:42:10

 

目录

 1.对象解构

2.对象解构的细节处理

2.1.解构的值对象中不存在时

2.2.给予解构值默认参数 

 2.3.非同名属性解构

3.数组解构

3.1基础解构语法

3.2数组嵌套解构

4.函数解构传参

5.解构小练习


在ES6的新语法中新增了解构的方法,它可以让我们很方便的从数组或者对象身上取数据,简化了大量重复的代码,让我们的代码更具可读性和维护性。

 1.对象解构

在没有对象解构的时期,我们如果想拿到对象身上的数据,就要通过类似于:user.name,这样的语法来获取数据,如果只是单层解构的对象还好,如果对象嵌套的解构很深,就会变的非常麻烦,我们的代码也会变得非常的赘余,很影响可读性,所以解构语法就应运而生了。

看下面的代码,在ES6之前我们取对象的值必须要这样

let user = {
  name: 'zs',
  age: 16,
  sex: '男',
  address: {
    pro: '湖南',
    city: '长沙'
  }
}

//传统的获取值
let name = user.name
let age = user.age
let sex = user.sex
let pro = user.address.pro
let city = user.address.city

 有了对象解构后我们的语法就会变得非常的简短,但功能完全没变

//对象解构语法
let {name,age,sex,address: { pro, city }} = user

很直观的就可以看到代码变得非常的简短,让人非常的舒适

2.对象解构的细节处理

2.1.解构的值对象中不存在时

当我们解构的值是对象中不存在的值时

let user = {
  name: 'zs',
  age: 16,
  sex: '男',
  address: {
    pro: '湖南',
    city: '长沙'
  }
}
//对象解构语法
let { name, age, gender, address:{ pro,city} } = user
console.log(name, age, gender, pro,city)

 

比如我们解构了一个:gender,但是对象中并不存在这个值,此时该值是:undefined,因为这里要知道的是我们的这一行代码其实是定义:let { name, age, gender, address:{ pro,city} },当你定义的时候本身就是没有值的,所以就是undefined

2.2.给予解构值默认参数 

前面解构不存在的值是未定义,那如果要给默认值,我们只要给它赋值即可,这就是给与默认值

//对象解构语法
let { name, age, gender="女", address:{ pro,city} } = user
console.log(name, age, gender, pro,city)

 

 2.3.非同名属性解构

这种情况就是当我们解构的值定义的变量名与对象中的不一样时,可以用这种语法:sex:gender,这样解构的值就赋值到gender身上了

let user = {
  name: 'zs',
  age: 16,
  sex: '男',
  address: {
    pro: '湖南',
    city: '长沙'
  }
}
//对象解构语法
let { name, age, sex:gender, address:{ pro,city} } = user
console.log(name, age, gender, pro,city)

3.数组解构

其实数组的解构与对象的解构差别不大,在解构数组时就可以将数组也看成一个对象

3.1基础解构语法

这是可以根据索引来解构的方法

//数组解构
let arr = ['a', 'b', 'c', 'd']
let { 0: n1, 1: n2 } = arr
console.log(n1, n2) //  a  b
let { 2: n3, 3: n4 } = arr
console.log(n3, n4) // c  d

 也可以这样子解构

//数组解构
let arr = ['a', 'b', 'c', 'd']

let [n1, n2] = arr
console.log(n1, n2) // a  b
let [, , n3, n4] = arr
console.log(n3, n4) // c  d

当然数组结构也是可以携带默认值的,和对象解构类似,直接赋值即可

3.2数组嵌套解构

//数组嵌套解构
let arr = ['a', 'b', 'c', 'd', [1, 2, 3, 4]]
let [, , , , newArr] = arr
console.log(newArr) // [1,2,3,4]
//获取第五项中的某一个值
let [, , , , [, , n3]] = arr
console.log(n3) // 3

4.函数解构传参

这是我们平常传入一个对象参数,在函数中要使用的场景

//函数解构传参
let user = {
  name: 'zs',
  age: 16,
  sex: '男',
  address: {
    pro: '湖南',
    city: '长沙'
  }
}

function print(user) {
  console.log(`name:${user.name}`)
  console.log(`age:${user.age}`)
  console.log(`sex:${user.sex}`)
  console.log(`pro:${user.address.pro}`)
  console.log(`city:${user.address.city}`)
}
print(user)

有了解构之后就会变得非常简单

function print({ name, age, sex, address: { pro, city } } = user) {
  console.log(`name:${name}`)
  console.log(`age:${age}`)
  console.log(`sex:${sex}`)
  console.log(`pro:${pro}`)
  console.log(`city:${city}`)
}
print(user)

 实战做项目时,在函数中我们经常会用到各种参数,可能会有默认值或者没有默认值,这时候我们就可以灵活的使用上面的解构对象以及解构数组的方法,让我们的代码看起来更加的简洁,我们也能减少很多赘余的代码,大大提升了代码的可读性。

5.解构小练习

5.1,下面是一个对象,我们要实现解构出name,然后将其他的所有属性放到一个新的对象中

let user = {
  name: 'zs',
  age: 16,
  sex: '男',
  address: {
    pro: '湖南',
    city: '长沙'
  }
}

这里利用扩展运算符即可实现

let { name, ...obj } = user //利用展开运算符收集剩下的属性
console.log(name, obj)

5.2,下面有一个对象,解构出第二条评论的用户名和用户内容

let article = {
  title: '文章标题',
  content: '文章内容',
  comments: [
    {
      content: '评论1',
      user: {
        id: 1,
        name: '用户名1'
      }
    },
    {
      content: '评论2',
      user: {
        id: 2,
        name: '用户名2'
      }
    }
  ]
}

 利用上面的知识就可以很轻松的解构出我们需要的元素

//解构出第二条评论的用户名和用户内容
//name:'用户名2',content:'评论2'
let {
  comments: [
    ,
    {
      content,
      user: { name }
    }
  ]
} = article

console.log(content, name)

 

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

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

相关文章

如何实现两个对象之间的属性拷贝

两个对象之间的属性拷贝 你可以使用Java的BeanUtils类或类似工具来实现两个对象之间的属性拷贝。以下是一个示例代码: import org.apache.commons.beanutils.BeanUtils;public class CopyPropertiesExample {public static void main(String[] args) throws Excep…

java学习路程之篇一、进阶知识、面向对象高级、static关键字、继承、final关键字、this、super

文章目录 面向对象高级static关键字继承final关键字 面向对象高级 static关键字 继承 final关键字

【统计课堂】SPSS统计分析- R×C列联表资料统计方法的选择

之前我们提到RC列联表资料,列联表根据变量是否有序可以分为双向无序、单项有序、双向有序列联表,他们的统计方法是不同的 一、双向无序列联表 双向无序列联表是指行、列变量均为无序的列联表,比如不同污染地区的动物畸形率是否有差异&#x…

RT1052的时钟

文章目录 时钟主时钟图时钟树 系统时钟 时钟 主时钟图表明了各个 PLL 时钟(总共 7 个 PLL)的由来和通路;时钟树图,则表明了 RT1052 内部各个根时钟(CLK ROOT)的由来和通路。 主时钟图 图中总共有7个PLL&…

mybatis sql 参数自动填充

项目中打印sql,参数都是需要自己复制进去,很不方便,例如: Preparing: SELECT id,product_code,product_name,del_flag,create_time,create_by,update_time,update_by,remark FROM product_info WHERE (del_flag ?) LIMIT ? > Parameters: false(B…

结构型设计模式之外观模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

DNS协议详解

DNS协议详解 DNS协议介绍DNS解析过程DNS查询的方式递归查询迭代查询区别 DNS协议介绍 DNS 协议是一个应用层协议,它建立在 UDP 或 TCP 协议之上,默认使用 53 号端口。该协议的功能就是将人类可读的域名 (如,www.qq.com) 转换为机器可读的 IP…

【深度学习】RNN学习笔记

RNN学习笔记 时间序列 将单词序列转换为向量,这里有五个单词,然后对于每一个单词都进行独热编码,编码成一个特定的向量。 对于RNN网络,需要一次性读取多个句子,那么涉及到batch_size,这里第二个表达就是&a…

Vue上传图片返回base64并在页面展示,并图片上canvas进行红框框选标记

https://www.cnblogs.com/szqtiger/p/12100754.html vue如何显示base64图片_vue显示base64_不断学习的码农的博客-CSDN博客 图片上进行红框框选_时小帅的博客-CSDN博客 设置canvas画布大小_canvas设置画布大小_最凶残的小海豹的博客-CSDN博客 图片回显 结合以上&#xff0…

MySQL8 新特性——窗口函数用法

MySQL8 新特性——窗口函数用法 MySQL 8.0 是 MySQL 数据库管理系统的一个重要版本,引入了许多新特性和改进。以下是 MySQL 8.0 的一些主要新特性: 事务隔离级别改进: MySQL 8.0 引入了新的事务隔离级别 SERIALIZABLE,提供了最高…

妙记多 Mojidoc PC端(Mac 端+windows端)Beta版本正式上线!

你们呼唤了无数次的妙记多 Mojidoc PC客户端 Beta版本正式上线啦! 感谢300位妙友积极参与内测,给予了我们很多非常有效的意见和建议!我们会根据用户反馈不断优化和修复相关功能,在此感谢妙友们一直以来的支持~ PC端拥…

静态html引入ucharts并直接使用组件标签

由于官方不能直接使用qiun-vue-ucharts在静态html页面使用。 DIY可视化对此类库进行了改进,把它的包独立打包成一个可以依赖的JS。 首先定义一个核心JS,用于打包生成uchart import qiunVueUcharts from qiun/vue-ucharts;const install (app) > {…

el-select实现el-option可编辑

鼠标悬浮出现编辑图标 点击编辑图标对选择项进行修改 核心代码如下&#xff0c;注意el-input不要使用focus&#xff0c;会导致el-select面板收起来&#xff1b;使用click.native.stop即可 <el-select v-model"value" placeholder"选择" style"widt…

酷雷曼无人机技能培训考试圆满举办

2023年7月18日、19日&#xff0c;以“向云端起航&#xff0c;让技术落地”为主题的酷雷曼无人机技能提升培训会在酷雷曼北京运营中心隆重举行&#xff0c;来自全国各地的众多合作商参加了本次培训&#xff0c;通过系统、全面的学习成功取得了专业无人机飞行员执照&#xff0c;为…

基于linux下的高并发服务器开发(第三章)- 3.10 死锁

deadlock.c #include <stdio.h> #include <pthread.h> #include <unistd.h>// 全局变量&#xff0c;所有的线程都共享这一份资源。 int tickets 1000;// 创建一个互斥量 pthread_mutex_t mutex;void * sellticket(void * arg) {// 卖票while(1) {// 加锁pt…

十、正则表达式详解:掌握强大的文本处理工具(二)

文章目录 &#x1f340;多字符匹配&#x1f340;匹配规则的代替&#x1f340;特殊的匹配&#x1f340;特殊的匹配plus&#x1f340;总结 &#x1f340;多字符匹配 星号&#xff08;*&#xff09;&#xff1a;匹配0个或者多个字符 import retext 111-222-333 result re.matc…

Cardboard for Pictures(cf)

Mircea有n张照片&#xff0c;第 i 张照片的是边长为si的正方形&#xff0c;他把每张照片都装在一块正方形的硬纸板上&#xff0c;这样每张照片的四周都有一个w厘米的硬纸板边框。他总共用了 c 立方厘米见方的硬纸板。给定图片大小和值c&#xff0c;求w。&#xff08;请注意&…

Java-API简析_java.net.InetSocketAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131870760 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

Dubbogo 详解

Dubbogo 详解 简介 dubbo功能很强大的微服务开发框架&#xff0c;支持多种通信协议&#xff0c;并具有流量治理的功能。 dubbo在有了大转变&#xff0c;拥抱了云原生&#xff0c;从哪些方面可以体现呢&#xff1f; 推出了自己的Trip协议修复了服务发现的级别&#xff0c;之…

Bug竞技场【已经修复】

目录 1.基础知识 2.最佳组合 2.1 铁男-螳螂 2.2 弟弟组合 海克斯抽卡bug 1.基础知识 背景&#xff1a;美测服-美服-马服-可以有效地减少bug率 复盘是为了更好的战斗&#xff01; 提前观看一些视频资料也是如此。 通过看直播博主的经验&#xff0c;可以让你关注到本来对战的…