zoukankan      html  css  js  c++  java
  • JS实现值复制

    在JS中对象一般都是传地址,后续修改也会影响原始数据。例如这样。

    var a={
        b:"b"
    };
     
    var c=a;
    c.b="c";
     
    console.log(a);
    console.log(c);

    会发现a.b也变成了"c"。 

    以下是网上一位高手写的JS实现值复制,独立复制一个对象,避免双向修改。

    //值复制
    function clone(obj) {
        //判断是对象,就进行循环复制
        if (typeof obj === 'object' && typeof obj !== 'null') {
            // 区分是数组还是对象,创建空的数组或对象
            var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {};
            for (var k in obj) {
                // 如果属性对应的值为对象,则递归复制
                if(typeof obj[k] === 'object' && typeof obj[k] !== 'null'){
                    o[k] = clone(obj[k])
                }else{
                    o[k] = obj[k];
                }
            }
        }else{ //不为对象,直接把值返回
            return obj;
        }
        return o;
    }

    上述代码有一个bug,就是针对null的处理,null在js中的类型是object,上述代码会将null复制成{}。根本的问题在于高手在条件“typeof obj === 'object' && typeof obj !== 'null'”的时候做了错误的判断,试想类型是object了肯定类型就不是null了吧。以下是修正后的方法:

    //值复制
    function clone(obj) {
        //判断是对象,就进行循环复制
        if (typeof obj === 'object' && obj!=null) {
            // 区分是数组还是对象,创建空的数组或对象
            var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {};
            for (var k in obj) {
                // 如果属性对应的值为对象,则递归复制
                if(typeof obj[k] === 'object' && obj[k]!=null){
                    o[k] = clone(obj[k])
                }else{
                    o[k] = obj[k];
                }
            }
        }else{ //不为对象,直接把值返回
            return obj;
        }
        return o;
    }

    更多个人技术文章请访问:http://88gis.cn/

  • 相关阅读:
    NTP时间同步
    《暗时间》
    寻找字典公共键
    maven pom.xml的execution报错
    maven安装scala插件
    html 和xml
    sparkstreaming+kafka
    zookeeper错误Error contacting service. It is probably not running.
    eclipse开发hive2程序
    eclipse开发hbase程序
  • 原文地址:https://www.cnblogs.com/tracyjfly/p/10794240.html
Copyright © 2011-2022 走看看