对象深浅拷贝
2018-10-30 17:35
211 查看
先看一下下面的例子:
var arr1 = [1,2,3]; var arr2 = arr1; arr2.push(4); console.log(arr1);//[1,2,3,4]
明明是对arr2做了处理,为什么arr1也会跟着变呢。这是因为对象都是存在内存地址中的,虽然表面看着是复制了一个新的对象出来,实质上两者指向的还是同一个地址。操作的时候改的是地址中的数据,所以引用同一地址的数据都会跟着改变,上述的拷贝我们把它称之为浅拷贝。
有些时候我们想在拷贝的时候同事改变对象的内存地址,就需要用到深拷贝。不仅将原对象的各个属性逐个复制出去,同时将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上,从而形成一个完全新的对象。
function deepClone(values) { var copy; // 处理null或undefined if (null == values || "object" != typeof values) return values; // 处理日期对象 if (values instanceof Date) { copy = new Date(); copy.setTime(values.getTime()); return copy; } // 处理数组 if (values instanceof Array) { copy = []; for (var i = 0, len = values.length; i < len; i++) { copy[i] = deepClone(values[i]); } return copy; } // 处理对象 if (values instanceof Object) { copy = {}; for (var attr in values) { if (values.hasOwnProperty(attr)) copy[attr] = deepClone(values[attr]); } return copy; } throw new Error ("Unable to copy values! Its type isn't supported."); } var obj = { 'name' : 'xiaohong', 'age' : '23' } var obj1 = deepClone(obj); obj1.name = 'star'; console.log(obj.name);//xiaohong console.log(obj1.name);//star阅读更多
相关文章推荐
- [置顶] C++/C#中堆栈、对象内存模型、深浅拷贝、Array.Clone方法
- C++/C#中堆栈、对象内存模型、深浅拷贝、Array.Clone方法
- JS对象的深浅拷贝
- 实现数组和对象的深浅拷贝
- javascript 对象的深浅拷贝
- javascript 对象深浅拷贝的解决方案
- C++:析构函数、对象生命周期、类型转换构造、拷贝构造、拷贝赋值、深浅拷贝
- 详解js中对象的深浅拷贝
- python对象的深浅拷贝
- javascript中对象的深浅拷贝
- 分析一下 原型模式的 UML 类图 。 复制对象, 深浅拷贝 月经贴 ,请回避
- 对象的深浅拷贝
- js 数组对象的深浅拷贝
- 实现数组和对象的深浅拷贝
- js对象的深浅拷贝
- 【自】javascript对象的深浅拷贝浅析
- js实现数组和对象的深浅拷贝
- 详解js中对象的深浅拷贝
- Javascript 对象复制(深浅拷贝)
- js 数组的深浅拷贝 js对象的深浅拷贝