服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - js教程 - JavaScript深拷贝方法structuredClone使用

JavaScript深拷贝方法structuredClone使用

2023-06-12 16:25天行无忌 js教程

这篇文章主要为大家介绍了JavaScript深拷贝方法structuredClone使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

对于深拷贝,最容易也应该是常见的方法是使用 JSON.parse() + JSON.stringify() ,还有一个借助第三方脚本库 lodash ,其中方法 cloneDeep 可以实现深拷贝。现在可以使用原生的 structuredClone() 方法。

浅拷贝与深拷贝

首先,先来了解一下浅拷贝和深拷贝的区别:

  • 浅拷贝:就是只拷贝对象的第一层。引用了更深层次的内容。可以使用扩展运算符 ... 或使用 Object.assign() 在 JavaScript 中实现浅拷贝。
  • 深拷贝:是指对象的所有层次都被复制。这是对象的真实副本。可以使用 JSON.parse() + JSON.stringify() 执行此操作,现在,还可以使用原生方法 structuredClone() 执行此操作。

使用 structuredClone 进行深拷贝

原生 structuredClone() 方法使用结构化克隆算法创建给定值的深层拷贝。

结构化克隆算法用于复制复杂 JavaScript 对象的算法。通过来自 Worker 的 postMessage() 或使用 IndexedDB 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。

语法如下:

?
1
2
structuredClone(value)
structuredClone(value, { transfer })
  • value:被克隆的对象。可以是任何结构化克隆支持的类型。
  • transfer:为可选参数,是一个可转移对象的数组,里面的 并没有被克隆,而是被转移到被拷贝对象上。

返回值:返回值是原始值的深拷贝。

下面是示例代码:

?
1
2
3
4
5
6
7
8
const objProfile = { name: "DevPoint", detail: { age: 30 } };
const deepCopy = structuredClone(objProfile);
const shallowCopy = { ...deepCopy };
console.log(shallowCopy); // {"name": "DevPoint", "detail": {  "age": 35 } }
deepCopy.name = "天行无忌";
deepCopy.detail.age = 35;
console.log(objProfile); // {"name": "DevPoint", "detail": {  "age": 30 } }
console.log(deepCopy); // {"name": "天行无忌", "detail": {  "age": 35 } }

正如在此代码片段中所见:

  • 更新第一层克隆对象的属性后,原始属性不会更新。
  • 在更深层次更新属性后,原始属性既不更新。发生这种情况是因为在这种情况下,还复制了更深层次。
  • 而对于浅拷贝对象 shallowCopy 来说,其值会随着对象 deepCopy 的变化而变化,在项目开发中很容易带来BUG

structuredClone() 现在可在所有主流浏览器和运行时(如 Node.jsDeno)的最新版本中使用。

以上就是JavaScript 中深拷贝方法structuredClone的详细内容,更多关于JavaScript 深拷贝的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7202531202418573368

延伸 · 阅读

精彩推荐
  • js教程JavaScript的一些小技巧分享

    JavaScript的一些小技巧分享

    这篇文章主要介绍了JavaScript的一些小技巧分享,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下...

    小蘑菇9432021-12-27
  • js教程JS中箭头函数与this的写法和理解

    JS中箭头函数与this的写法和理解

    这篇文章主要给大家介绍了关于JS中箭头函数与this的写法和理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    limingru10502021-12-31
  • js教程快速理解 TypeScript 的逆变和协变

    快速理解 TypeScript 的逆变和协变

    TypeScript 给 JavaScript 添加了一套静态类型系统,是为了保证类型安全的,也就是保证变量只能赋同类型的值,对象只能访问它有的属性、方法。...

    神光的编程秘籍7032022-04-19
  • js教程利用 JavaScript 实现并发控制的示例代码

    利用 JavaScript 实现并发控制的示例代码

    这篇文章主要介绍了利用 JavaScript 实现并发控制的示例代码,本文通过实例代码给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需...

    descire3972021-12-23
  • js教程typescript编写微信小程序创建项目的方法

    typescript编写微信小程序创建项目的方法

    这篇文章主要介绍了typescript编写微信小程序创建项目的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    无聊的人_nikolas5982022-01-11
  • js教程十个高级 TypeScript 开发技巧

    十个高级 TypeScript 开发技巧

    在使用了一段时间的 Typescript 之后,我深深地感受到了 Typescript 在大中型项目中的必要性。 可以提前避免很多编译期的bug,比如烦人的拼写问题。 并且越...

    web前端开发7982022-11-08
  • js教程JavaScript 声明私有变量的两种方式

    JavaScript 声明私有变量的两种方式

    这篇文章主要介绍了JavaScript 声明私有变量的两种方式,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下...

    _Fatman3732022-01-17
  • js教程JavaScript 语句之常用 for 循环详解

    JavaScript 语句之常用 for 循环详解

    这篇文章主要介绍了JavaScript 语句之常用 for 循环,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    js教程网10712022-02-21