javascript之深浅拷贝

原创 倔强的紫玫瑰 随笔 javascript 251阅读 2018-04-08 09:15:41 举报

为何写:

最近在研究深浅拷贝,找了很多资料,感觉不是很满意,所以自己就整理了一份。废话不多说,我们来一起复习一下吧,也希望留下您宝贵意见。

何为深浅拷贝?

深拷贝和浅拷贝是只针对Object和Array这样的复杂类型的

1.浅拷贝:

我们先来看2个栗子:

从栗子中可以看出:

a和b指向同一块内存,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝。

2.深拷贝:

如果给b放到新的内存中,将a的各个属性都复制到新内存里,就是深拷贝。

换句话说,也就是b的属性改变时,a的属性不会跟着变化。

常用的实现方法有哪些?

1.浅拷贝:

数组:

Array.slice()Array.concat()...

对象:

Object.assign()、 ...

栗子:

2.深拷贝:

JSON.parse( JSON.stringify(arr) )

在使用JSON.stringify() 需要注意一下几点:

1.JSON.stringify(..) 在将 JSON 对象序列化为字符串时和 toString() 的效果基本相同,只不过序列化的结 果总是字符串:

JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42""(含有双引号的字符串)
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"

2.所有安全的 JSON 值(JSON-safe)都可以使用 JSON.stringify(..) 字符串化。安全的 JSON 值是指能够呈现为有效 JSON 格式的值。
3.undefined、function、symbol (ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的对象都不符合 JSON结构标准,支持 JSON 的语言无法处理它们
4.JSON.stringify(..) 在对象中遇到 undefined、function 和 symbol 时会自动将其忽略,在
数组中则会返回 null(以保证单元位置不变)。
例如:

对包含循环引用的对象执行 JSON.stringify(..) 会出错。

当然也可以用JQ的extend 函数的实现,这里就不具体说了。

参考文档:
冴羽的JavaScript专题之深浅拷贝
Alloyteam深拷贝与浅拷贝的实现

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复