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/

  • 相关阅读:
    flume杀掉重启
    Tomcat访问日志浅析 (转)
    httpclient Accept-Encoding 乱码
    解决Maven报Plugin execution not covered by lifecycle configuration
    mahout基于Hadoop的CF代码分析(转)
    hadoop Mahout中相似度计算方法介绍(转)
    nginx配置文件结构,语法,配置命令解释
    nginx 中文和英文资料
    使用异步 I/O 大大提高应用程序的性能
    nginx AIO机制与sendfile机制
  • 原文地址:https://www.cnblogs.com/tracyjfly/p/10794240.html
Copyright © 2011-2022 走看看