• javascript对象的浅复制与深复制


    最近开始阅读jQuery源码,正巧看到了写插件的时候一直使用的extend,于是就尝试自己写个类似的方法,当然,这里不是来讨论extend的用法,而是来聊两个概念,javascript的浅复制与深复制。

    javascript浅复制:浅复制字面意思就是表面的复制,浅层的复制,那本质是什么呢,其实就是表面的复制,因为js在把一个对象赋值给另一个变量的时候,只是复制了引用,所以修改克隆后的对象,会影响到被克隆的对象。

    javascript深复制:深复制就跟浅复制相对了,连带对象内的对象也能复制,并且保证不会影响到被克隆的对象,实现方式就是遍历加递归

    下面来看源代码:

    function mix(newObj, obj, deep) {
        var valueType
        var args = Array.prototype.slice.call(arguments),
            deep = deep || false,
            i = 0;
        if (args.length > 2) {
            args.pop()
        }
        if (args.length < 2) {
            return newObj
        }
        if (typeof(obj) !== "object") {
            obj = {}
        }
        // 遍历需要克隆的对象,如果遇到对象内有对象或者数组,在克隆后的对象中添加一个新的实例化的属性,然后递归,把值传到这个新的实例化的属性中,如此递归下去就能保证对象的每个属性都是完全克隆而不是克隆的引用了
        for (key in obj) {
            valueType = Object.prototype.toString.call(obj[key])
            if (deep && valueType === '[object Object]') {
                newObj[key] = {}
                mix(newObj[key], obj[key], deep)
            } else if (deep && valueType === '[object Array]') {
                newObj[key] = []
                mix(newObj[key], obj[key], deep)
            } else {
                newObj[key] = obj[key]
            }
        }
        return newObj
    }
  • 相关阅读:
    linux brige中mac地址的比较
    BCM6358 加上TTL线 OPENWRT刷机全方位教程
    BCM6358 进入CFE界面
    BCM6358编译openwrt并刷机
    BCM6358开发板硬件资源 【OPENWRT刷机全方位教程】
    WRT54GS openwrt pppoe拨号
    CentOS6.5安装JDK1.8
    Sql Server 事物
    linux系统中的删除操作
    Java学习-集合的理解
  • 原文地址:https://www.cnblogs.com/junhua/p/4317964.html
Copyright © 2020-2023  润新知