zoukankan      html  css  js  c++  java
  • js object对象赋值bug和对象复制clone方法

    最近在写程序的时候发现,如果新建一个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!

  • 相关阅读:
    Nero8刻录引导系统光盘镜像图文教程
    C#多线程与并行编程方面的电子书,中英文版本
    [转]C#通过委托更新UI(异步加载)
    [PHP] 6种负载均衡算法
    [GIt] 团队工作效率分析工具gitstats
    [Git] git代码统计
    [Git] 写文章 史上最全文献检索、阅读及管理攻略
    [Git] 谷歌的代码管理
    [JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式
    [Mongo] 解决mongoose不支持条件操作符 $gt$gte:$lte$ne $in $all $not
  • 原文地址:https://www.cnblogs.com/zqifa/p/js-object-1.html
Copyright © 2011-2022 走看看