克隆一个数据结构

克隆一个数据结构;

一、克隆一个正则表达式

众所周知,在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__;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值