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/

posted @ 2019-04-30 09:34  馨语随风  阅读(2810)  评论(0编辑  收藏  举报