JS回顾 你要知道的 ...三点运算符操作对象及数组的各种用法

前言

JavaScript中,合理使用...运算符对对象和数组 进行解构赋值等,可以让我们写出更加简洁的代码,可以帮我们省下多次重复读取对象下的某个属性的繁琐流程,一定程度上提升了我们的开发效率,但在使用时也有一些注意项,下面我们就来探究一下...运算符在对对象数组进行解构赋值的各种用法。

1. 对象解构赋值

1.1 普通对象解构赋值并提供默认值

下面是一个最简单的对象解构赋值的例子:

js 复制代码
let user = {
  name: '张三',
  age: 18,
  sex: '男'
}
let { name, age = 0, sex, weight = '180斤' } = user
console.log(name, age, sex, weight) // 张三 18 男 180斤

以上在解构赋值的过程中,我们分别给user对象的ageweight属性提供了默认值,由于在user对象中已经存在age属性,所以使用的是原来的值,weight属性不存在与该对象中,所以应用默认值。

1.2 对象解构属性重命名并提供默认值

下面是在对象进行解构给属性进行重命名后再赋默认值的例子:

js 复制代码
let user = {
  name: '张三',
  age: 18,
  sex: '男'
}
let { age: age2, name: name2, sex: sex2, weight: myWeight = '180斤' } = user
console.log(name2, age2, sex2, myWeight)  // 张三 18 男 180斤
console.log(age)  // Uncaught ReferenceError: age is not defined

由于解构赋值的属性名已经变更,所以变更前的属性名为未定义状态。

1.3 对象解构赋值,直接对已有变量进行修改

下面是对外部作用域中,已经存在相同属性名的变量进行直接修改的例子:

js 复制代码
let user = {
  name: '张三',
  age: 18,
  sex: '男'
}
let name = 'vilan';
let age = 20;
let sex = '女';
console.log(name, age, sex); // vilan 20 女
// 需要括号包起来形成整体(否则赋值左边会被认为是一个代码块,给代码块进行赋值会报错),并且括号前面需要加分号
({ name, age, sex } = user);
/**
 * error: Declaration or statement expected.  This '=' follows a block of statements, so if you intended to write a destructuring assignment, you might need to wrap the whole assignment in parentheses.
 * 需要声明或陈述。这个'='跟在语句块后面,所以如果您打算编写解构式赋值,可能需要将整个赋值用圆括号括起来。
 */
console.log(name, age, sex) // 张三 18 男

下面是对外部作用域中,已经存在不相同属性名的变量进行直接修改的例子:

js 复制代码
let user = {
  name: '张三',
  age: 18,
  sex: '男'
}
let name2 = '马哥';
let age2 = '66';
let sex2 = '女';
console.log(name2, age2, sex2); // 马哥 66 女

({ name: name2, age, sex } = user);
console.log(name2, age2, sex2); // 张三 18 男

以上例子我们通过对象解构重命名为已经存在的变量名进行直接修改该变量值。

note: 在一些团队的eslint验证规范中可能不允许使用;的情况,那么为了可以加个{}代码块包裹解构语句

js 复制代码
let user = {
  name: '张三',
  age: 18,
  sex: '男'
}
// 不加分号,可以加个代码块
{
  ({ name, age, sex } = user)
}
console.log(name, age, sex) // 张三 18 男

2.嵌套对象解构赋值

下面是一个基本的嵌套对象解构赋值例子:

js 复制代码
const user = {
  name: '张三',
  age: 18,
  sex: '男',
  address: {
    city: '北京',
    street: '朝阳区',
    detail: {
      house: '01',
      room: '302'
    }
  }
}

let { name, age, sex, address: { city, street, detail: { house, room } } } = user
console.log(name, age, sex, city, street, house, room) // 张三 18 男 北京 朝阳区 01 302

当存在嵌套对象时,我们在使用嵌套的对象属性时通常会这样使用user?.address?.city,增加一个可选连操作符(?) ,这是因为没有给对象提供默认值,对象可能为undefined导致报错。

下面这个方法是一个嵌套对象,我们可以像下面这样把里面的所有属性给默认值:

js 复制代码
function getLocation({
  name = '李四',
  age = 20, 
  sex = '女',
  address = {
    city = '北京', 
    street = '朝阳区',
    detail = {
      house = '01',
      room = '302'
    } = {}
  } = {}
} = {}) {
  console.log(name, age, sex, city, street, house, room)  // 李四 20 女 北京 朝阳区 01 302
}
// 直接执行不传参数
getLocation()

getLocation方法参数中,我们给最外层对象提供了一个空对象为默认值,这样就能继续对内部nameagesexaddress进行解构,接着对address赋默认值为空对象,继续对内部属性citystreetdetail解构,最后detail内部属性解构也是同理。

3.数组进行解构赋值

1.普通数组进行解构赋值

js 复制代码
// 2.1普通数组解构
let list = ['张三', '18', '男']
let [name, age, sex, weight = '保密'] = list
console.log(name, age, sex, weight) // 张三 18 男 保密

2.嵌套数组进行解构赋值

js 复制代码
let list2 = [
  ['张三', '18', '男'],
  ['李四', '20', '女']
]
let [
  [name, age, sex],
  [name2, age2, sex2]
] = list2
console.log(name, age, sex) // 张三 18 男
console.log(name2, age2, sex2)  // 李四 20 女

3.使用解构赋值进行数组转对象

js 复制代码
let list = ['张三', '18', '男']
let persion = {
  ...list
}
console.log(persion)  // {0: "张三", 1: "18", 2: "男"}

总结

在开发中合理利用...运算符进行解构赋值可以为我们的开发提供诸多便利,但也还是要结合自身开发场景进行使用,只要能够为你的代码阅读起来更清晰,提升代码的可维护性,你可以选择使用它。

相关推荐
m0_7482552619 分钟前
easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层
前端·excel
长风清留扬39 分钟前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
web147862107231 小时前
C# .Net Web 路由相关配置
前端·c#·.net
m0_748247801 小时前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
飞的肖1 小时前
前端使用 Element Plus架构vue3.0实现图片拖拉拽,后等比压缩,上传到Spring Boot后端
前端·spring boot·架构
青灯文案11 小时前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
m0_748254881 小时前
DataX3.0+DataX-Web部署分布式可视化ETL系统
前端·分布式·etl
ZJ_.1 小时前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营1 小时前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架