• 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
    }
  • 相关阅读:
    preprocess
    数组
    共用体
    动态内存管理函数
    C链表
    文件的定位与出错检查
    字符串读写函数
    C文件操作
    位运算
    爱好-超级IP:超级IP
  • 原文地址:https://www.cnblogs.com/junhua/p/4317964.html
Copyright © 2020-2023  润新知