最近开始阅读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 }