重构slice

120 阅读1分钟

重构slice

第一步:判断传过来的值是否是数字方法

  //判断传过来的值是否是数字
  function isNumber(obj) {
    //不等于NaN 并且 是个有限数字
    return !isNaN(Number(obj)) && isFinite(obj)
  }

第二步:解决负数问题方法

  function isPositive(obj) { 
    //如果是负数进入判断
    if (Math.sign(obj.num) === -1) { 
       //负数截取值转换:截取值 = 当前的长度-负数的绝对值
      obj.num = obj.self.length - Math.abs(obj.num)
      //返回新的截取值
      return obj.num
    }
    return obj.num
  }

第三步:截取方法

  function cutOut(obj) {
    let result = obj.value
    for (let i = obj.start; i < obj.end; i++) {
       result[result.length]=obj.self[i]
    }
    return result
  }

第四步:重构slice方法

  //实现slice
  function mySlice(start, end) {
    let self = this
    //判断start,end是否赋值
    start || (start = 0)
    end || (end = this.length)
    start = isPositive({self,num:start})
    end = isPositive({self,num:end})
    //判断赋值是否正确
    if (isNumber(start) && isNumber(end)) { 
      let result = cutOut({ value: [], start, end, self })
      //如果字符串,把返回的数组转换为字符串
      if (Object.prototype.toString.call(self) === '[object String]') {
        result = result.join('')
      }
      return result
    }
  }

第五步:封装推送到原型

  Array.prototype.mySlice = mySlice
  String.prototype.mySlice = mySlice