让前端飞

JS对象的深度COPY的方法

2017-07-31  本文已影响0人  Cookieboty

JS的对象copy在前端开发中很常见,也是有比较困扰众多初级的前端开发的地方,下面结合自己的经验简单的介绍一下JS对象的赋值,深浅COPY等问题。

首先:JS对象是怎么样传递的

1. JS引用

例子1:

var obj = {

name: 'zhangsan',

age: 23

}

var obj1 = obj

obj1.name= 'lisi'

console.log('obj===' + JSON.stringify(obj))

console.log('obj1===' + JSON.stringify(obj1))

上述例子中,打印见过显而易见

因为JS在处理过程中,虽然创建了一个新的对象,但是引用的却是同一个地址,所以在obj1改变的时候,也改变了地址的量,从而影响到了obj这个最初的对象,这里的对象引用可以对比一下指针。

JS在处理(数组,对象)copy的时候会按址传递,引用类型在值传递的时候是内存中的地址

2. JS赋值

var string= 'ABC'; //把ABC的值 赋予了string

var string1= myVa; // string赋值给 string1

string1= 'DEF'; //修改string1

打印结构也是显而易见,string1的修改并不会影响到string的值

因为这个时候,string的值保存在变量,并不是地址,所以赋值给string1的时候,是创建了一个新的变量,两个是相对应得个体,所以并不会相互影响。

JS在处理基本类型(包括undefined,Null,boolean,String,Number)copy的时候会按址传递。

总结:JS在创建对象的时候,相互之间的赋值会引用同一个地址,而创建一个变量的时候,相互之间的赋值则不会引用同一个地址,直接创建一个变量出来,而直接赋值的这种copy称之为浅copy,这个问题,我相信很多初学前端的开发者,很容易放错。

深度copy原理:

所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改。

通俗来说,无非就是copy对象的时候,将对象拆解之后,重新命名,防止两个对象同时引用同一个地址

深度copy的方法:

1. 把对象或者数组递归遍历,以key:value的形式,创建一个新的对象或者数组出来

2. 我自己的方法,那就比较偷懒了

var obj = {

name: 'zhangsan',

age: 23

}

var obj1 = JSON.stringify(obj)

obj1 = JSON.parse(obj1)

obj1.name= 'lisi'

console.log('obj===' + JSON.stringify(obj))

console.log('obj1===' + JSON.stringify(obj1))

实测结果是

,原理是我将对象序列化之后变成基本类型String,赋值之后再返序列化变成对象,所以两个对象引用的地址不会一样,比较投机的完成深度copy。

以上是JS对象深度COPY的一些总结,如有不同的见解或意见,欢迎探讨。

上一篇下一篇

猜你喜欢

热点阅读