带你读《现代Javascript高级教程》十七、JavaScript深拷贝与浅拷贝(3)

简介: 带你读《现代Javascript高级教程》十七、JavaScript深拷贝与浅拷贝(3)

带你读《现代Javascript高级教程》十七、JavaScript深拷贝与浅拷贝(2)https://developer.aliyun.com/article/1349577?groupCode=tech_library


3) 数组浅拷贝

对于数组的浅拷贝,可以使用 slice() 或展开语法。

 

const sourceArray = [1, 2, 3];const targetArray1 = sourceArray.slice();const targetArray2 = [...sourceArray];
console.log(targetArray1); // 输出:[1, 2, 3]
console.log(targetArray2); // 输出:[1, 2, 3]

 

在上述代码中,我们使用 slice() 方法和展开语法将源数组的元素复制到目标数组中。targetArray1 targetArray2 都是 sourceArray 的浅拷贝副本。

3. 深拷贝与浅拷贝的应用场景

深拷贝和浅拷贝各有适用的场景:

 

  • 深拷贝的应用场景:
  • 当需要创建一个对象的完全独立副本时,以防止对原始对象的修改。
  • 在对象状态管理中,需要创建对象的副本以记录历史状态、实现撤销和重做等操作。
  • 在数据变换和处理过程中,创建对象的副本以避免对原始数据的修改。

 

  • 浅拷贝的应用场景:
  • 当只需要复制对象的引用,而不需要创建对象的副本时。
  • 在一些简单的数据处理场景中,浅拷贝可以更高效地完成任务。

4. 注意事项

在使用深拷贝和浅拷贝时,需要注意以下几个问题:

 

  • 循环引用:深拷贝和浅拷贝都需要注意循环引用的问题。循环引用是指对象之间相互引用,导致无限循环。在处理循环引用时,深拷贝需要使用额外的数据结构(如 Map 或 WeakMap)进行记录和判断,而浅拷贝则无法解决循环引用的问题。
  • 特殊类型的处理:在实现深拷贝和浅拷贝时,需要注意特殊类型的处理。特殊类型包括函数、正则表达式等。对于特殊类型,深拷贝可以选择直接引用原始对象,而浅拷贝只会复制引用。
  • 性能开销:深拷贝是一项相对耗费性能的操作,特别是在处理大型对象或嵌套层次很深的对象时。在实际应用中,需要根据场景权衡性能和需求。
  1. 结论

深拷贝和浅拷贝是JavaScript中常用的拷贝方式,每种方式都有其适用的场景和注意事项。通过实现一个完整而优雅的深拷贝函数,我们可以轻松地创建对象的独立副本,并处理循环引用和特殊类型。浅拷贝则提供了一种快速复制对象的方式,适用于简单的数据处理场景。根据实际需求和性能要求,选择适合的拷贝方式,可以更好地满足业务需求。

  1. 参考资料
  • MDN Web Docs: Object.assign()open in new window
  • MDN Web Docs: Spread Syntax
相关文章
|
2月前
|
JavaScript
vue中使用 HotKeys.js 教程(按键响应、快捷键开发)
vue中使用 HotKeys.js 教程(按键响应、快捷键开发)
144 0
|
3天前
|
JSON JavaScript 数据格式
手写JS实现深拷贝函数
本文介绍了如何实现一个深拷贝函数`deepClone`,该函数可以处理对象和数组的深拷贝,确保拷贝后的对象与原始对象在内存中互不干扰。通过递归处理对象的键值对和数组的元素,实现了深度复制,同时保留了函数类型的值和基础类型的值。
11 3
|
1月前
|
JavaScript NoSQL 前端开发
|
1月前
|
JavaScript 前端开发
JavaScript中的深拷贝与浅拷贝
JavaScript中的深拷贝与浅拷贝
35 2
|
1月前
|
JavaScript 前端开发
JavaScript中的深拷贝和浅拷贝的实现讲解
在JavaScript中,浅拷贝与深拷贝用于复制对象。浅拷贝仅复制基本类型属性,对于引用类型仅复制引用,导致双方共享同一数据,一方修改会影响另一方。深拷贝则完全复制所有层级的数据,包括引用类型,确保双方独立。浅拷贝可通过简单属性赋值实现,而深拷贝需递归复制各层属性以避免共享数据。
37 1
|
1月前
|
JavaScript 前端开发
js中浅拷贝和深拷贝的区别
js中浅拷贝和深拷贝的区别
23 0
|
1月前
|
JavaScript 前端开发
js中浅拷贝,深拷贝的实现
js中浅拷贝,深拷贝的实现
27 0
|
1月前
|
存储 JavaScript 前端开发
JS浅拷贝及面试时手写源码
JS浅拷贝及面试时手写源码
|
2月前
|
JSON JavaScript 数据格式
vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】
vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】
297 3
|
2月前
|
存储 JavaScript 前端开发
js【详解】数据类型原理(含变量赋值详解-浅拷贝)
js【详解】数据类型原理(含变量赋值详解-浅拷贝)
30 0