【题外话】:

es6中...用作reset剩余参数时,说法趋于一致。但它的另一个用处就有两种叫法了,

一个是阮一峰为首的叫法“spread扩展运算符”,

一个是mdn的zh-CN版译文叫法"展开语法"

【正文】:

关于js中的“深拷贝与浅拷贝“两个术语

图示中mdn的反例有明确说明“现在数组a也被也影响了”。

 

对应着网络上一个很常见的说法“如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝

 

——但很多博客一个常见的错误出现在遍历层数这个角度,混淆了“深层遍历”与“深拷贝”

这儿mdn上也出了个纰漏,竟然写到“只遍历一层”

关于js中的“深拷贝与浅拷贝“两个术语

在图示的示例代码中,a数组的b拷贝与c拷贝均能成功拷贝出二级数组中两个复杂元素。

关于js中的“深拷贝与浅拷贝“两个术语

对于对象a的示例也能做到“深层遍历” (区分于 深拷贝)。

这里还可以看出,第一层对象中的a属性,在通过扩展运算符拷贝时没有因为a对象中a属性的改变而改变,达到了“第一层的深拷贝” 也许这就是mdn中译文的意思,对第一层的基本数据(非复杂数据)进行深拷贝。

concat方法与slice方法也是同样,即 “扩展运算符、concat、slice 均仅对第一层的基本数据实现深拷贝

关于js中的“深拷贝与浅拷贝“两个术语

 

 

下面这篇文章很好的从"栈堆基本数据类型引用数据类型"的角度出发去区分深拷贝与浅拷贝,此处暂不做过多阐述

https://www.cnblogs.com/echolun/p/7889848.html

 

笔者常用的一个深拷贝策略,就是文章中也提到的方法2:

对原对象先进行一次JOSN.stringify处理,再进行一次JSON.parse

let obj = {...}//原对象;

let objClone = JSON.parse(JSON.stringify(obj));

相关文章:

  • 2021-11-01
  • 2022-02-02
  • 2021-10-20
  • 2021-07-09
  • 2022-01-14
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-29
  • 2022-12-23
  • 2021-12-20
  • 2021-08-03
  • 2022-12-23
  • 2021-10-12
相关资源
相似解决方案