js object对象赋值bug和对象复制clone方法

来源:互联网 发布:unity3d 官方demo 编辑:程序博客网 时间:2024/06/05 09:28
最近在写程序的时候发现,如果新建一个object对象objb,初始化值为obja,如果改变了objb对象的字段值,那么obja也会随之改变,看来对象赋值传递的是一个引用。

代码重现:

 

 1 <script> 2     var obja = { 3         'apple':{'key':'apple','name':'苹果'}, 4         'banana':{'key':'banana','name':'香蕉'}, 5     }; 6  7     var objb = obja; 8  9     console.log(obja);10     delete(objb['apple']);11     console.log(obja);12 </script>

 

执行结果:

Object {apple: Object, banana: Object}
Object {banana: Object}

 

解决办法clone,生成一个新的对象,而不是对原对象的引用。

代码如下:

 

 1 <script> 2     function clone(obj) { 3         var o; 4         if (typeof obj == "object") { 5             if (obj === null) { 6                 o = null; 7             } else { 8                 if (obj instanceof Array) { 9                     o = [];10                     for (var i = 0, len = obj.length; i < len; i++) {11                         o.push(clone(obj[i]));12                     }13                 } else {14                     o = {};15                     for (var j in obj) {16                         o[j] = clone(obj[j]);17                     }18                 }19             }20         } else {21             o = obj;22         }23         return o;24     }25 26     var obja = {27         'apple':{'key':'apple','name':'苹果'},28         'banana':{'key':'banana','name':'香蕉'},29     };30 31     var objb = clone(obja);32 33     console.log(obja);34     delete(objb['apple']);35     console.log(obja);36 </script>

 

执行结果:

Object {apple: Object, banana: Object}
Object {apple: Object, banana: Object}

 

 

纯文字:

最近在写程序的时候发现,如果新建一个object对象objb,初始化值为obja,如果改变了objb对象的字段值,那么obja也会随之改变,看来对象赋值传递的是一个引用。

代码重现:

<script>
var obja = {
'apple':{'key':'apple','name':'苹果'},
'banana':{'key':'banana','name':'香蕉'},
};

var objb = obja;

console.log(obja);
delete(objb['apple']);
console.log(obja);
</script>

执行结果:

Object {apple: Object, banana: Object}
Object {banana: Object}

解决办法clone,生成一个新的对象,而不是对原对象的引用。

代码如下:

<script>
function clone(obj) {
var o;
if (typeof obj == "object") {
if (obj === null) {
o = null;
} else {
if (obj instanceof Array) {
o = [];
for (var i = 0, len = obj.length; i < len; i++) {
o.push(clone(obj[i]));
}
} else {
o = {};
for (var j in obj) {
o[j] = clone(obj[j]);
}
}
}
} else {
o = obj;
}
return o;
}

var obja = {
'apple':{'key':'apple','name':'苹果'},
'banana':{'key':'banana','name':'香蕉'},
};

var objb = clone(obja);

console.log(obja);
delete(objb['apple']);
console.log(obja);
</script>

执行结果:

Object {apple: Object, banana: Object}
Object {apple: Object, banana: Object}

 

done!

 

原创粉丝点击