当前位置: 首页 > news >正文

掌握 JavaScript 解构赋值的指南

JavaScript 的解构赋值是一种从数组 or 对象中提取值并将其赋给变量的语法。这种语法让我们从复杂的数据结构中提取数据变得简洁和易读。解构赋值可以用在数组、对象以及嵌套结构中。

解构是:使用 ES6 的一种语法规则,将一个对象或数组的某个属性提取到某个变量中。

解构不会对被解构的目标造成任何影响。

1. 数组解构赋值

数组解构赋值允许我们将数组中的值提取到变量中。基本语法如下:

const [a, b, c] = [1, 2, 3];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

如果数组的某个位置没有值,可以为其设置默认值:

const [x = 1, y = 2] = [10];
console.log(x); // 10
console.log(y); // 2

使用 ... 运算符可以将剩余的元素放入一个数组中:

const [first, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(rest);  // [2, 3, 4, 5]

2. 对象解构赋值

对象解构赋值允许我们将对象的属性值提取到变量中。基本语法如下:

const { name, age } = { name: 'Alice', age: 18 };
console.log(name); // 'Alice'
console.log(age);  // 18

如果对象中没有指定的属性,可以为其设置默认值:

const { name, age = 30 } = { name: 'Bob' };
console.log(name); // 'Bob'
console.log(age);  // 30

可以给解构出来的属性重新命名:

const { name: fullName, age: years } = { name: 'Charlie', age: 35 };
console.log(fullName); // 'Charlie'
console.log(years);    // 35

可以解构嵌套的对象:

const person = {name: 'Dave',address: {city: 'New York',zip: '10001'}
};const { name, address: { city, zip } } = person;
console.log(name); // 'Dave'
console.log(city); // 'New York'
console.log(zip);  // '10001'

在嵌套解构中设置默认值:

const person = {name: 'Eve',address: {}
};const { name, address: { city = 'Unknown' } } = person;
console.log(name); // 'Eve'
console.log(city); // 'Unknown'

3. 解构赋值在函数参数中的应用

解构赋值可以直接在函数参数中使用,简化函数调用:

function greet({ name, age }) {console.log(`Hello ${name}, you are ${age} years old.`);
}const user = { name: 'Frank', age: 4 };
greet(user); // Hello Frank, you are 4 years old.

4. 解构赋值与变量交换

可以利用解构赋值来交换变量的值: 

let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(a); // 2
console.log(b); // 1

5. 注意点

5.1 默认值的计算

当使用默认值时,这些默认值是在解构赋值操作时计算的:

const { x = Math.random() } = {};
console.log(x); // 每次运行都可能是不同的值

如果对象中的属性已经有值,则默认值不会被使用,只在目标属性为 undefined 时使用。

const { x = Math.random() } = {x: 10};
console.log(x); // 10
5.2 解构赋值中的 undefined 和 null 

解构赋值仅对 undefined 提供默认值,不对 null 提供。如果对象的属性是 null,默认值不生效。 

const { a = 1 } = { a: null };
console.log(a); // null
5.3  解构赋值的深度

深度解构需要确保每一层的对象结构都存在。否则会引发错误:

const obj = { a: { b: 1 } };
const { a: { b, c = 2 } } = obj;
console.log(b); // 1
console.log(c); // 2// 如果 obj = {},则会抛出错误
// const { a: { b, c = 2 } } = {};

5.4  解构赋值的计算顺序

在对象解构赋值中,计算顺序可能会影响结果:

const obj = { a: 1 };
const { a, b = a } = obj;
console.log(a); // 1
console.log(b); // 1

此处,a 赋值为 1,b 的默认值是 a,因此 b 的值是 1。

const obj = { a: 1, b: 2 };
const { a = 10, b = a } = obj;
console.log(a); // 1
console.log(b); // 2

此处,a 和 b 各自存在值,均不使用默认值。

5.5 解构赋值与函数参数

在函数参数中使用解构赋值时,要确保传入的参数结构与解构的变量名一致:

function func({ a, b }) {console.log(a, b);
}
func({ a: 1, b: 2 }); // 1 2
func({ a: 1 }); // 1 undefined
func({}); // undefined undefined
5.6 解构赋值与函数默认参数

在函数的参数解构中使用默认值时,需要注意函数参数的默认值的顺序:

function func({ a = 1, b = a } = {}) {console.log(a, b);
}
func(); // 1 1
func({ a: 2 }); // 2 2
func({ b: 3 }); // 1 3
5.7 防止解构赋值错误

确保在解构赋值之前检查对象或数组是否存在。如果对象或数组是 null 或 undefined,尝试解构将会引发错误:

let obj = null;
// const { a } = obj; // 这会抛出错误obj = {};
const { a = 1 } = obj;
console.log(a); // 1
5.8 解构赋值中的计算属性名

如果需要解构具有动态计算属性名的对象,确保正确地使用方括号语法:

const key = 'b';
const obj = { a: 1, [key]: 2 };const { [key]: value } = obj;
console.log(value); // 2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 蜜罐网络MHN安装过程中的坑
  • Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化
  • Windows 下载安装RabbitMQ
  • 干货分享:推荐四大在线翻译神器!
  • 26. 在集合中删除元素时,为什么使用Iterator.remove()而不是Collection.remove()?
  • GeoScene Pro教程(004):GeoScene Pro制作与使用矢量切片包
  • STL之string
  • 技术指南:5分钟零成本实现本地AI知识库搭建
  • vue3+vant4父组件点击提交并校验子组件form表单
  • 【区块链 + 司法存证】优证云:基于 FISCO BCOS 的存证平台 | FISCO BCOS应用案例
  • 【Python自动化办公】复制Excel数据:将各行分别重复指定次数
  • c++多线程下崩溃一例分析 ACTIONABLE_HEAP_CORRUPTION heap failure block not busy DOUBLE
  • 如何优化Oracle数据库的性能?
  • 多目标应用:基于自组织分群的多目标粒子群优化算法(SS-MOPSO)的移动机器人路径规划研究(提供MATLAB代码)
  • 计算机基础知识总结(八股文--计算机网络、操作系统、数据库、c++、数据结构与算法)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 30秒的PHP代码片段(1)数组 - Array
  • C++类中的特殊成员函数
  • CentOS7 安装JDK
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 奇技淫巧
  • JavaScript函数式编程(一)
  • java第三方包学习之lombok
  • js 实现textarea输入字数提示
  • Twitter赢在开放,三年创造奇迹
  • 笨办法学C 练习34:动态数组
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端js -- this指向总结。
  • 如何编写一个可升级的智能合约
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 项目管理碎碎念系列之一:干系人管理
  • 再次简单明了总结flex布局,一看就懂...
  • 自动记录MySQL慢查询快照脚本
  • Nginx实现动静分离
  • postgresql行列转换函数
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​力扣解法汇总946-验证栈序列
  • # 数论-逆元
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • ()、[]、{}、(())、[[]]命令替换
  • (1)无线电失控保护(二)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (k8s中)docker netty OOM问题记录
  • (二)丶RabbitMQ的六大核心
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)ORM
  • .net dataexcel winform控件 更新 日志
  • .NET Micro Framework初体验
  • .net 流——流的类型体系简单介绍