
JavaScript 知识梳理[一] 变量类型,浅拷贝,深拷贝
发布日期:2021-05-15 07:31:53
浏览次数:9
分类:精选文章
本文共 1479 字,大约阅读时间需要 4 分钟。
JavaScript 变量类型及深浅拷贝
在编程语言中,变量的类型是理解和操作程序的基础。JavaScript 和 Java 等语言一样,变量的类型直接影响数据处理方式。了解变量类型的特性,可以帮助我们在数据复用或处理时做出合适的选择。
变量类型
变量类型可以分为 值类型 和 引用类型。值类型包括:
- 基本类型:
number
(数字)、string
(字符串)、boolean
(布尔)、null
(空值)、undefined
(未定义)、symbol
(符号)和bigint
(大整数)。 - 数组类型:
Array
。 - 函数类型:
Function
。
引用类型则包括:
- 对象类型:
Object
(普通对象)、Date
(日期)、RegExp
(正则表达式)等。 - 数组类型:
Array
(实际上归类于值类型,但在实现上存储为引用类型)。 - 函数类型:
Function
(归类于值类型,但在实现上可视为引用类型)。
值类型与引用类型的存储方式
值类型直接存储在栈中,程序执行时会直接获取这些值。而引用类型存储的不是实际数据,而是数据的地址(引用)。栈中存储的是引用地址,而实际数据存储在堆中。
浅拷贝与深拷贝
浅拷贝和深拷贝都针对引用类型的数据。两者的主要区别在于,浅拷贝是否复制目标对象的地址,而深拷贝是否复制目标对象的实际内容。
浅拷贝
浅拷贝仅拷贝引用地址,例如:
const obj = { a: 1 };const copy = obj; // 浅拷贝,copy 和 obj 引用同一个对象obj.a = 2; // 修改后,copy.a 也会变成 2
深拷贝
深拷贝会创建一个新的对象,复制目标对象的所有属性值,例如:
const obj = { a: 1 };const deepCopy = JSON.parse(JSON.stringify(obj)); // 创建新对象obj.a = 2; // 修改原对象,深拷贝对象保持 a: 1
实现深拷贝的方法
Object.assign
方法:const obj = { a: 1 };const copy = Object.assign({}, obj); // 深拷贝
- 解构赋值:
- JSON 转换法:
- 递归拷贝:
const { a, b } = obj;const copy = { a, b }; // 浅拷贝
const obj = { a: 1 };const copy = JSON.parse(JSON.stringify(obj)); // 深拷贝
function deepClone(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } const result = Array.isArray(obj) ? [] : {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { result[key] = deepClone(obj[key]); } } return result;}
通过上述方法,可以实现对引用类型数据的深拷贝。需要注意的是,深拷贝的方法是否真正实现深拷贝,取决于对象的结构(如是否包含嵌套对象或数组)。
总结
理解变量类型和深浅拷贝是编程的核心技能之一。值类型和引用类型的区别直接影响数据操作方式,而深浅拷贝则帮助我们在数据复用时避免意外修改。通过合理选择拷贝方法,可以确保程序的安全性和正确性。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月25日 10时55分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
BUU-MISC-认真你就输了
2019-03-09
BUU-MISC-caesar
2019-03-09
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
2019-03-09
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
The wxWindows Library Licence (WXwindows)
2019-03-09
leetcode——第203题——虚拟头结点
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
MySQL----基础及常用命令
2019-03-09
flink启动(二)
2019-03-09
前端开发进阶手册.pdf
2019-03-09
软件架构设计和MESH经验之谈
2019-03-09
关于宝塔面板安装的mysql用Navicat连接出现2003的错误解决
2019-03-09
Windows2016 FTP用户隔离
2019-03-09