有效的对象拷贝应该是指深拷贝。
创新互联主要从事成都网站设计、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务同安,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!
深拷贝:就是重新复制一块内存,这样就不会互相影响。
有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。
这个时候我们会用到深拷贝。
深拷贝的方法:
var deepCopy = function(source)
{
var result;
(source instanceof Array) ? (result = []) : (result = {});
for (var key in source) {
result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key];
}
return result;
}
简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。
浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。
使用 js ON.stringify和 js ON.parse实现深拷贝:JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象;
缺陷:它会抛弃对象的 const ructor,深拷贝之后,不管这个对象原来的构造 函数 是什么,在深拷贝之后都会变成Object;这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON;
递归拷贝实现深拷贝,解决循环引用问题
浅拷贝只是拷贝了引用, 数据在内存中还是一个, 如果引用的对象发生了变化, 该变量也会同步变化.
深拷贝相当于把内存上的数据拷贝了一份, 此时修改该变量不会影响原来的变量, 同理修改原来的变量也不会影响现在的变量.
浅拷贝:
const foo = { bar: 'bar', baz: 'baz' }
const ref_foo = foo
深拷贝(最简单的方法, 拷贝性能也不弱):
const foo = { bar: 'bar', baz: 'baz' }
const ano_foo = JSON.parse(JSON.stringify(foo))
4.通过第三方工具实现深拷贝
lodash.cloneDeep
数组深拷贝
1. concat(arr1, arr2,....)
2. slice(idx1, idx2)
参数可以省略
1)没有参数是拷贝数组
2)只有一个参数是从该位置起到结束拷贝数组元素
3)两个参数,拷贝从起始位置到结束位置的元素(不包含结束位置的元素:含头不含尾)
注意:当数组中的元素均为一维是深拷贝
数组中元素一维以上是值的引用
// 浅拷贝
function copy(o) {
var result = {};
for(var i in o)
result[i] = o[i];
return result;
}
// 深拷贝
function deepCopy(o) {
var result = {};
for(var i in o)
result[i] = (typeof o[i]) === 'object' ? deepCopy(o[i]) : o[i];
return result;
}
这就是浅拷贝,大兄弟