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!

  • 相关阅读:
    3、二进制的秘闻和不同进制间的转换
    Hello World!
    HDU5883 The Best Path(欧拉回路 | 通路下求XOR的最大值)
    Codeforces 722C(并查集 + 思维)
    Floyd 算法求多源最短路径
    vim 配置
    STL容器 -- Vector
    STL容器 -- Bitset
    HDU 5707 Combine String(动态规划)
    HDU 5876 Sparse Graph(补图上BFS)
  • 原文地址:https://www.cnblogs.com/zqifa/p/js-object-1.html
Copyright © 2011-2022 走看看