JavaScript深度克隆

本文介绍了一种在JavaScript中实现对象深拷贝的方法,并通过两个示例展示了如何使用该方法来复制包含复杂嵌套结构的对象。同时,文章还讨论了日期和正则表达式对象的特殊处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 方法一 在Object.prototype中添加clone();
 * RegExp 类型的对象调用JSON.stringify() 只会打印一个{}
 */
Object.prototype.clone = function () {
    if (this === null || !(typeof this === "object")) {
        return this;
    } else if (Object.prototype.toString.call(this).slice(8, -1) === "Date") {
        return new Date(this.getTime());
    } else if (Object.prototype.toString.call(this).slice(8, -1) === "RegExp") {
        var pattern = this.valueOf();
        var flags = '';
        flags += pattern.global ? 'g' : '';
        flags += pattern.ignoreCase ? 'i' : '';
        flags += pattern.multiline ? 'm' : '';
        return new RegExp(pattern.source, flags);
    }
    var o = Array.isArray(this) ? [] : {};
    for (var attr in this) {
        if (typeof this[attr] == "object") {
            o[attr] = this[attr].clone();
            continue;
        }
        o[attr] = this[attr]
    }
    return o;
};
/*
 test
 ----------------------------------------------------------
 */
var obj = {
    a: 3,
    b: "p",
    c: false,
    d: function (e) {
        console.log(e);
    },
    e: undefined,
    arr: [1, 3, {
        a: 1,
        b: "2",
        arr: [1, new Date(),/[^\d]/g , 3]
    }]
};
var object = obj.clone();
object.arr[2].arr[0] = 4;
console.log(obj.arr[2].arr[0]);
console.dir(object)
console.log(JSON.stringify(obj));
console.log(JSON.stringify(object));
/**
 * 或者定义一个copy();
 * 事实证明 JavaScript的类型自动转换能力真的很强将所有基本类型都包装了 instanceof Object is true (坑爹).
 */

function copy(obj) {
    if (obj === null || !(typeof obj === "object")) {
        return obj;
    } else if (Object.prototype.toString.call(obj).slice(8, -1) === "Date") {
        return new Date(obj.getTime());
    } else if (Object.prototype.toString.call(obj).slice(8, -1) === "RegExp") {
        var pattern = obj.valueOf();
        var flags = '';
        flags += pattern.global ? 'g' : '';
        flags += pattern.ignoreCase ? 'i' : '';
        flags += pattern.multiline ? 'm' : '';
        return new RegExp(pattern.source, flags);
    }
    // var o = isArray(obj) ? [] : {};
    var o = Array.isArray(obj) ? [] : {};
    for (var attr in obj) {
        if (typeof obj[attr] == "object") {
            o[attr] = copy(obj[attr]);
        } else {
            o[attr] = obj[attr];
        }
    }
    return o;
}
/*
 test
 ----------------------------------------------------------
 */
var obj = {
    a: 3,
    b: "p",
    c: false,
    d: function (e) {
        console.log(e);
    },
    arr: [1, 3, {
        a: 1,
        b: "2",
        arr: [1, 2, 3, {
            a: "c",
            arr: ["8", 1],
        }]
    }]
};
console.log(copy(null));
console.log(copy(4));
var o = copy(obj);
o.arr[2].arr[2] = 100;
console.log(JSON.stringify(obj));
console.log(JSON.stringify(o));

/*
 附Array.isArray的具体实现方法! ECMAScript5已经实现!
 为什么不用instanceof? 因为很多时候instanceof不可靠 比如对象所在Windows不同时!
 */
function isArray(obj) {
    return typeof obj === "object" && Object.prototype.toString.call(obj).slice(8, -1) === "Array";
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值