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)
我们发现,上述的方法会忽略值为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:>
上一篇: win10 1803无法安装origin该怎么办?
下一篇: 迅捷CAD编辑器怎么描图?