资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

javascript拷贝,js函数拷贝

JavaScript怎样进行真正有效的对象拷贝

有效的对象拷贝应该是指深拷贝。

创新互联主要从事成都网站设计、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务同安,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务: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实现深拷贝的几种方法

简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。

浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。

使用 js ON.stringify和 js ON.parse实现深拷贝:JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象;

缺陷:它会抛弃对象的 const ructor,深拷贝之后,不管这个对象原来的构造 函数 是什么,在深拷贝之后都会变成Object;这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON;

递归拷贝实现深拷贝,解决循环引用问题

JavaScript中浅拷贝和深拷贝的区别和实现

浅拷贝只是拷贝了引用, 数据在内存中还是一个, 如果引用的对象发生了变化, 该变量也会同步变化.

深拷贝相当于把内存上的数据拷贝了一份, 此时修改该变量不会影响原来的变量, 同理修改原来的变量也不会影响现在的变量.

浅拷贝:

const foo = { bar: 'bar', baz: 'baz' }

const ref_foo = foo

深拷贝(最简单的方法, 拷贝性能也不弱):

const foo = { bar: 'bar', baz: 'baz' }

const ano_foo = JSON.parse(JSON.stringify(foo))

JS中实现深拷贝的几种方法(object,Array)

4.通过第三方工具实现深拷贝

lodash.cloneDeep

数组深拷贝

1. concat(arr1, arr2,....)

2. slice(idx1, idx2)

参数可以省略

1)没有参数是拷贝数组

2)只有一个参数是从该位置起到结束拷贝数组元素

3)两个参数,拷贝从起始位置到结束位置的元素(不包含结束位置的元素:含头不含尾)

注意:当数组中的元素均为一维是深拷贝

      数组中元素一维以上是值的引用

怎么实现javascript浅拷贝

// 浅拷贝

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;

}

这就是浅拷贝,大兄弟


分享名称:javascript拷贝,js函数拷贝
网页路径:http://cdkjz.cn/article/dsepphj.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220