js 数组方法splice底层原理(重构)

splice 方法 是一种数组方法

splice方法的所有操作会改变原数组,返回值是删除的原数组中的数据

传一个参数的时候,是从这个参数位置的下标开始,删除数组后面的所有数组

传两个参数的时候,第二个参数是删除的个数,是从第一个参数位置开始删除对应的个数

传三个参数的时候,从第三个参数开始,是在删除位置依次插入第三个参数开始的数据,先删除,再插入,哪里删除,哪里插入

当不传入参数的时候,原数组不发生改变,返回值是undefined

以下为底层原理:

Array.prototype.mySplice = function(){
  //先判断有没有传参,没有返回 undefined
  if(arguments.length == 0) return
  // 拿到 n 是从第几位删除的下标
  let n = arguments[0]
  // 创建一个空数组  用来存返回值 返回被删除的数据
  let newArr = []
  // 如果没有写第二个参数,直接修改原数组 length 
  if(!arguments[1]){
    for(let i = n,j=0;i < this.length ; i++,j++){
      newArr[j] = this[i]
    }
    this.length = n
    return newArr
  }
  // b 是需要删除几位,是个数
  let b = arguments[1]
  let lastArr = [] // 创建一个数组,用来存最后要覆盖原数组的数据
  for(let i = 0; i < n; i++) lastArr[i] = this[i]  // 先把最前面不删除的几个拿到
  for(let j = 2; j < arguments.length ; j++){ // 把要插入的数据,遍历,插入到新数组中
    lastArr.push(arguments[j]) 
  }
  for(let i = n,k=0; k < b ;i++,k++){
    if(n + k > this.length-1) break // 判断如果删除的个数,加上从第几位删除的和,大于原数组长的时候,打断循环
    newArr[k] = this[i] // 得到被删除的数据组成的数组  返回值就是这个
  }
  for(let i = n + b; i < this.length; i++){ // n + b 就是最后面不需要删除的数据开始的下标 值肯定小于数组最后一位的下标,逐个遍历,push到新数组中
    lastArr.push(this[i])
  }
  // 最后修改原数组的值 先把原数组的 length 长度 修改成 新数组一样的长度,然后再遍历
  this.length = lastArr.length
  for(let i = 0; i < lastArr.length ; i ++){
    this[i] = lastArr[i]
  } 
  return newArr
}

上一篇:比较数据泵和exp/imp对相同数据导出/导入的性能差异


下一篇:删除替换插入数组集合指定位置和splice和slice区别