欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js中的对象拷贝解析

程序员文章站 2023-11-21 08:19:04
js 中的对象拷贝 js 中对象的拷贝很常见,特别是在面试中很常见 一: 对象浅拷贝与深拷贝和对象引用的区别 var a= {name:'anikin'} var b = js...

js 中的对象拷贝

js 中对象的拷贝很常见,特别是在面试中很常见

一: 对象浅拷贝与深拷贝和对象引用的区别

var a= {name:'anikin'}
var b = jsons
a == b  // true
b.name == 'jack'
a.name  // 'jack'

上述代码中,使用了=进行赋值,于是b指向了a所指向的栈的对象,也就是a与b指向了同一个栈对象,所以在对b.name赋值时,a.name也发生了变化。

为了避免上面的情况,可以对对象进行拷贝,代码如下:

var a = {name:'wanger'}
var b = object.assign({}, a)
a===b // false
b.name = 'zhangsan'
a.name //'wanger'

上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆,这时候a与b指向的是不同的栈对象,所以对b.name重新复制也不会影响到a.name。

但是如果a.name是一个对象的引用,而不是一个字符串,那么上面的代码也会遇到一些问题,参考如下代码:

var a = {name:{firstname:'wang',lastname:'er'}}
var b = object.assign({}, a)
a===b // false
b.name.firstname = 'zhang'
a.name.firstname //'zhang'

b.name.firstname又影响到了a.name.firstname,这是因为object.assign()方法只是浅层拷贝,a.name是一个栈对象的引用,赋值给b时,b.name也同样是这个栈对象的引用,很多时候,我们不想让这种事情发生,所以我们就需要用到对象的深拷贝。

二、使用json.parse()与json.stringify()对对象进行拷贝

 var b = json.parse(json.stringify(a))

这种方法只适用于纯数据json对象的深度克隆,因为有些时候,这种方法也有缺陷,参考如下代码:

var clone = function (obj) {
    return json.parse(json.stringify(obj));
}
var a = {
     a:function(){console.log('hello world')},
     b:{c:1},
     c:[1,2,3],
     d:"wanger",
     e:new date(),
     f:null,
     g:undefined
}
var b = clone(a)

js中的对象拷贝解析
我们发现,上述的方法会忽略值为function以及undefied的字段,而且对date类型的支持也不太友好。喎?https: www.2cto.com/kf/ware/vc/"="" target="_blank" class="keylink">vcd4ncjxwprj80qq99lxeysejrmnpyva3vbeo1rve3l/lwqhurcq8tttp89fuye21xna1o6yyu8tcv8vcocv8vmyz0lxe1rwhoyds8rtl1nrtw9xiupa3vbeotctksbry0khqxmq508ohozwvcd4ncjxwpjxzdhjvbmc+yp2jrcdsu7dj0ls3qdwvc3ryb25npjwvcd4ncjxwcmugy2xhc3m9"brush:sql;"> function myextends(t,c){ //用后面的覆盖前面的 var t = t||{}; for( var attr in c ){ if( c.hasownproperty(attr) ){ if( typeof c[attr] == 'object'){ //console.log(c[attr],c[attr].contructor ) t[attr] = (c[attr].constructor === array)[]:{} arguments.callee(t[attr],c[attr]) }else{ t[attr] = c[attr] } } } return t } 喎?https:>