盘点几种数据类型的解构赋值细节

简介: 解构:可以在数组或对象中的值分离出来赋值:将解构出来的数据对变量进行赋值

解构赋值

何为解构赋值

  • 解构:可以在数组或对象中的值分离出来
  • 赋值:将解构出来的数据对变量进行赋值

在ES5中的普通的变量赋值方法:

var a = 1;
var b = 2;
复制代码

在ES6中的解构赋值方法,一句话解构赋值方法的过程即镜像,两边的互为镜像,相同位置变量和数值一一对应

let [a,b] = [1,2] // 等价于上述
复制代码

使用解构赋值方法可以将赋值变得灵活,下面将对解构赋值进行讲解

数组解构

嵌套解构

js允许数组和对象的成员为数组或对象,所有当数组为嵌套数组的时候,依旧可以对数组进行解构赋值

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

扩展运算符解构

在解构中可以使用...扩展运算符

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

不完全解构

两边不一定是完全匹配的,可以根据实际需要,对其进行解构赋值

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

不成功的解构

当解构目标是其他类型的时候解构是不成功的

let [a] = 1
console.log(a) // TypeError: 1 is not iterable
复制代码

又或者当目标赋值变量与右侧解构目标不匹配的时候,如下列,b的值为undefined,所以解构也是不成功的

let [a,b] = [1]
console.log(a,b) // 1 undefined
复制代码

关于interator

在不成功的解构中如果的解构目标为一个数值,那么抛出的错误为1 is not iterable,翻译一下:1是不可被可迭代的,下面了解一下interator即迭代器和解构赋值的关系。

js中内置了表示集合数据结构比如:Array,Object,两者都含有interator,而undefined,null,NaN等等是不包含interator的,解构赋值无法作用于不含有interator的数据结构,而所有包含interator的数据解构都可以被解构赋值

带有默认值的解构赋值

在不成功的解构中包含了不匹配的情况,而这种情况可以使用默认值来解决,无论是哪种类型的解构赋值都可以预先对变量进行赋值,避免不匹配而造成解构不成功的现象。

let [a,b=2] = [1]
console.log(a,b) // 1 2
let [c = 1] = [undefined]
console.log(c) // 1
复制代码

关于undefined的问题

当对变量赋为默认值,解构目标数组内只含有一个undefined的情况下,变量最终会赋值为默认值,但是如果是NaNnull的情况下会是怎么样的。

let [c = 1] = [NaN]
console.log(c) // NaN
let [c = 1] = [null]
console.log(c) // null
复制代码

出现上述情况的原因是因为在ES6中使用的是===来判断一个位置是否含有值,造成了NaNnull不严格等于undefined的情况。

对象解构

与数组解构的不同

因为数组是有下标的,但是对象没有,对象只能依靠属性名,所以在对象的解构赋值时,变量名需要与解构对象中目标属性名一致

let {name} = {name:"猪痞恶霸"}
console.log(name) // 猪痞恶霸
复制代码

变量名与属性名不一致

在重构前辈的代码的时候会遇到不可逆转的情况,所以我们可以使用:来解决这个不可逆转问题

let {name:difname} = {name:"猪痞恶霸"}
console.log(difname) // 猪痞恶霸
复制代码

其实这里是根据解构模式的本质来即模式匹配来实现的,使用name来匹配对象中的属性来完成变量名的更改

多层嵌套对象的解构赋值

let people = {
    name:"猪痞恶霸",
    like:{
        community:"juejin",
        code:"js"
    }
}
let {name,like:{code}} = people
console.log(name,code) // 猪痞恶霸 js
复制代码

对象多层嵌套的话,可以根据一层一层的匹配来解构到所需的属性,比如上面想要拿到code,所以先匹配到like对象,再对like对象进行解构赋值拿到code

模式问题

经过上面的例子清楚了多层对象的解构方法,通过模式匹配来拿到下一层属性或者对象,那么这里的模式即like是不能够拿到值得,我们打印一下会出现like is not defined的问题,这个是需要注意的。

字符串解构

上面提到过可以被解构赋值的数据类型包括数组和对象等含有迭代器的数据类型,而字符串能够像前两者一样被解构,是因为在进行解构赋值的时候,字符串被转化为了一个类似数组的对象,一个类似数组的对象会是什么呢,下面来看一下。

let str = "猪痞恶霸"
let {1:first} = str
console.log(first) // 痞
复制代码

这是个很有意思的现象,通过模式匹配,使用1拿到痞,这个地方大致就能明白为什么叫一个类似数组的对象

除此之外还可以使用数组形式的解构方式

let str = "猪痞恶霸"
let [a] = str
console.log(a) // 猪
复制代码

我们还可以通过对象解构形式拿到字符串的属性,比如说字符串的长度

let str = "猪痞恶霸"
let {length} = str
console.log(length) // 4
复制代码

数值与布尔值解构

数值和布尔值能够被解构赋值的原因是因为在解构之前可以将其转化为对象

let { toFixed:a} = 123
console.log(a)  // toFixed() { [native code] }
复制代码

可以直接解构出数值的一些方法和属性比如上述解构出toFixed方法

利用原型链判断

上面解构出toFixed方法,那么这里可以通过原型链来判断两者之间的异同

console.log(a === Number.prototype.toFixed) // true
复制代码

显而易见,两者是等价的,正如此说明在解构前数值会转变为对象形式,包含了其属性和通过原型得到的方法

布尔值的解构与数值解构相同

函数参数解构

函数参数解构其实是函数与之前解构的结合,至少我是这么认为的

function add([x,y]) {
    return x+y
}
add([1,2]) // 3
复制代码

但是这种解构方式又有什么实际的作用,和普通的变量参数有什么区别,请看下面的例子

let arr = [[1,2],[2,3]]
arr.map((item) => item[0]+item[1])
复制代码

我们使用map遍历一个嵌套数组,然后再将其每个成员数组内的成员相加,这是使用普通参数方法实现,那么来使用解构赋值看一下。

let arr = [[1,2],[2,3]]
arr.map(([a,b]) => a+b)
复制代码

这样就很舒服,不需要复杂的下标来定位数组成员,直接使用解构赋值剥离即可。

参考文献

  • ES6标准入门第三版


相关文章
|
10月前
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
683 2
|
10月前
|
人工智能 边缘计算 自然语言处理
Google 发布其开源模型系列最新模型 Gemma 3
Google 发布了其开源模型系列的最新成员 Gemma 3,这是一款轻量级、高性能的 AI 模型,支持多语言和复杂任务。它具备 140+ 语言支持、128K-token 上下文窗口、增强的多模态分析能力以及函数调用功能,适用于聊天 AI、代码生成等多种场景。Gemma 3 在性能上超越 Llama 3-8B 和 Mistral 7B,且仅需单 GPU 即可运行,大幅降低计算成本。提供 1B 至 27B 不同参数规模版本,满足多样化需求,并优化了量化模型以适应边缘计算和移动设备。其多模态设计整合了 SigLIP 图像编码器,扩展上下文窗口至 128k token,显著提升了视觉和文本理解能力。
677 3
Google 发布其开源模型系列最新模型 Gemma 3
|
SQL 安全 PHP
【PHP 开发专栏】PHP 防止 SQL 注入的方
【4月更文挑战第30天】本文介绍了PHP防止SQL注入的策略,包括理解SQL注入的原理和危害,如数据泄露和系统控制。推荐使用参数化查询(如PDO扩展)、过滤和验证用户输入,以及选择安全的框架和库(如Laravel)。此外,强调了保持警惕、定期更新维护和开发人员安全培训的重要性,以确保应用安全。
393 3
|
机器学习/深度学习 数据采集 Java
我深度学习0基础,还训练出一个识别验证码模型!
我深度学习0基础,还训练出一个识别验证码模型!
720 0
我深度学习0基础,还训练出一个识别验证码模型!
|
JSON 编解码 安全
【HTTP】方法(method)以及 GET 和 POST 的区别
【HTTP】方法(method)以及 GET 和 POST 的区别
454 1
|
监控 安全 Java
基于java的商店积分管理系统的设计与实现
基于java的商店积分管理系统的设计与实现
308 2
|
机器学习/深度学习 计算机视觉
技术心得:卷积自编码器CAEs
技术心得:卷积自编码器CAEs
357 0
|
Docker 微服务 Python
Docker Compose 简介、安装、初步体验
本文是博主安装Docker 和体验docker的记录,希望对大家有所帮助。
414 0
Docker Compose 简介、安装、初步体验
|
敏捷开发 前端开发 关系型数据库
Docker搭建开源版禅道以及项目基本流程介绍
禅道是一款国产开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、组织管理等于一体,是一款专业的研发项目管理软件,完整的覆盖了软件研发项目的整个生命周期。
Docker搭建开源版禅道以及项目基本流程介绍
|
算法 决策智能 C++
干货 |【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
干货 |【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
1234 0