• 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案例
    推荐算法
    Hive安装
    打开相机
    打电话,发短信
    温度传感器,摇一摇
    经度,纬度,获取
    团队站立会议01
    团队项目计划会议
    "群英队"电梯演讲
  • 原文地址:https://www.cnblogs.com/tracyjfly/p/10794240.html
Copyright © 2020-2023  润新知