克隆一个数据结构;
一、克隆一个正则表达式
众所周知,在javascript语言中,正则表达式是一个引用类型的数据结构;
typeof /[a-z]/
// object
如果需要克隆一个正则表达式,我们不仅需要克隆实例的正则字面量,还需要克隆正则的实例属性,详情可见正则表达式;
我们可以通过reg.source取到一个正则表达式的文本。然后通过new RegExp的方式构建一个新的正则表达式;
let reg = /[a-z]/g;
function cloneReg(reg) {
let newReg = new RegExp(reg.source,/\w*$/.exec(reg));
newReg.lastIndex = reg.lastIndex;
newReg.flags = reg.flags;
return newReg;
}
let copy = cloneReg(reg); // /[a-z]/
在上面的函数中,创建正则表达式的第二个参数需要考虑克隆正则表达式的修饰的问题,所以使用/\w*$/
进行匹配;他会将所有的修饰符比如i、g
等作为第二个参数;因此克隆后的函数也就具备了同样的修饰;
二、克隆一个数组
数组的克隆就相对简单了,就是将被克隆的数组的每一个元素都拷贝下来就好了;其实可以用一个slice
这个api就可以了,但是lodash源码中是按照下面的方式处理的;
function copyArray(source, array) {
let index = -1
const length = source.length
array || (array = new Array(length))
while (++index < length) {
array[index] = source[index]
}
return array
}
将新数组中的每一个位置放入原数组相应位置的值;这就是数组克隆的本质;
三、克隆一个对象
克隆一个对象就是将一个对象中的每一个key都赋值给一个空对象;并且也要指定相应的继承对象;
function copyObject(source, object) {
const isNew = !object
object || (object = {})
let props = Reflect.ownkeys(source);
for(const key of props){
object[key] = source[key]
}
object.__proto__ = source.__proto__;
}