【题外话】:
es6中...用作reset剩余参数时,说法趋于一致。但它的另一个用处就有两种叫法了,
一个是阮一峰为首的叫法“spread扩展运算符”,
一个是mdn的zh-CN版译文叫法"展开语法"
【正文】:
图示中mdn的反例有明确说明“现在数组a也被也影响了”。
对应着网络上一个很常见的说法“如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝”
——但很多博客一个常见的错误出现在遍历层数这个角度,混淆了“深层遍历”与“深拷贝”
这儿mdn上也出了个纰漏,竟然写到“只遍历一层”
在图示的示例代码中,a数组的b拷贝与c拷贝均能成功拷贝出二级数组中两个复杂元素。
对于对象a的示例也能做到“深层遍历” (区分于 深拷贝)。
这里还可以看出,第一层对象中的a属性,在通过扩展运算符拷贝时没有因为a对象中a属性的改变而改变,达到了“第一层的深拷贝” 也许这就是mdn中译文的意思,对第一层的基本数据(非复杂数据)进行深拷贝。
concat方法与slice方法也是同样,即 “扩展运算符、concat、slice 均仅对第一层的基本数据实现深拷贝”
下面这篇文章很好的从"栈堆,基本数据类型与引用数据类型"的角度出发去区分深拷贝与浅拷贝,此处暂不做过多阐述
https://www.cnblogs.com/echolun/p/7889848.html
笔者常用的一个深拷贝策略,就是文章中也提到的方法2:
对原对象先进行一次JOSN.stringify处理,再进行一次JSON.parse
let obj = {...}//原对象;
let objClone = JSON.parse(JSON.stringify(obj));