• 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/

  • 相关阅读:
    iOS 9和xcode7设置
    iOS9.0 生成证书流程一(非推送)
    Undefined symbols for architecture i386: "_OBJC_CLASS_$_KKGridView", referenced from:
    iOS 日志自动上报
    百度编辑器ueditor1.4.3配置记录
    2016年初中数学知识点中考总复习总结归纳
    Ubuntu搭建LAMP环境
    ubuntu 配置lamp
    phpstorm zhuce ma
    请帮忙给看下
  • 原文地址:https://www.cnblogs.com/tracyjfly/p/10794240.html
Copyright © 2020-2023  润新知