js数组实例方法:entries,every,fill

Array.prototype.entries()

  • entries() 方法返回一个新的数组迭代器对象,该对象包含数组中每个索引的键/值对
  • 语法
    • entries()
  • 返回值
    • 一个新的可迭代迭代器对象
  • Array.prototype.myEntries()
Array.prototype.myEntries = function () {
  const newThis = []
  for (let i = 0; i < this.length; i++) {
    newThis[i] = [i, this[i]]
  }
  return Iterator.from(newThis)
}

Array.prototype.every()

  • every() 方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值
  • 语法
    • every(callbackFn)
    • every(callbackFn, thisArg)
  • 参数
    • callback:为数组中的每个元素执行的函数。它应该返回一个真值以指示元素通过测试,否则返回一个假值。该函数被调用时将传入以下参数:
      • element:数组中当前正在处理的元素
      • index:正在处理的元素在数组中的索引
      • array:调用了 every() 的数组本身
      • thisArg:执行 callbackFn 时用作 this 的值
  • 返回值
    • 如果 callbackFn 为每个数组元素返回真值,则为 true。否则为 false
  • Array.prototype.myEvery()
Array.prototype.myEvery = function (callback, thisArg) {
  if (typeof callback !== 'function') {
    throw new TypeError(`${typeof callback} is not function`)
  } else {
    // 使用len的长度做for循环
    const len = this.length
    for (let i = 0; i < len; i++) {
      // 判断当前位置是否是空槽,是的话不做处理,不是的话调用callback函数
      if (!this.hasOwnProperty(i)) {
        continue
      } else {
        const value = callback.call(thisArg, this[i], i, this)
        // 如果函数值为false,则return false,终止循环
        if (!value) return false
      }
    }
    return true
  }
}

Array.prototype.fill()

  • fill() 方法用一个固定值填充一个数组中从起始索引(默认为 0)到终止索引(默认为 array.length)内的全部元素。它返回修改后的数组
  • 语法
    • fill(value)
    • fill(value, start)
    • fill(value, start, end)
  • 参数
    • value:用来填充数组元素的值。注意所有数组中的元素都将是这个确定的值:如果 value 是个对象,那么数组的每一项都会引用这个元素
    • start:基于零的索引,从此开始填充,转换为整数。
      • 负数索引从数组的末端开始计算,如果 start < 0,则使用 start + array.length
      • 如果 start < -array.length 或 start 被省略,则使用 0
      • 如果 start >= array.length,没有索引被填充
    • end:基于零的索引,在此结束填充,转换为整数。fill() 填充到但不包含 end 索引
      • 负数索引从数组的末端开始计算,如果 end < 0,则使用 end + array.length
      • 如果 end < -array.length,则使用 0
      • 如果 end >= array.length 或 end 被省略,则使用 array.length,导致所有索引都被填充
      • 如果经标准化后,end 的位置在 start 之前或之上,没有索引被填充
  • 返回值
    • 经 value 填充修改后的数组
  • Array.prototype.myFill()
Array.prototype.myFill = function (value, start, end) {
  const len = this.length
  function getStartOrEnd(val, len) {
    let newVal
    switch (true) {
      case val < 0 && val >= -len:
        newVal = len + val
        break
      case val < -len:
        newVal = 0
        break
      case val >= len || Number.isNaN(val):
        newVal = len
        break
      case val >= 0 && val < len:
        newVal = val
        break
      default:
    }
    return newVal
  }
  // 稀疏数组会被填充 可以直接使用for循环 不能用for of或者for in
  let newStart = getStartOrEnd(start, len) || 0
  let newEnd = getStartOrEnd(end, len) || len
  for (let i = 0; i < len; i++) {
    /**
     * end的位置在start之前或者之上,没有索引被填充
     * value不写即为传入默认的undefined
     * 从start开始,填充到end,但是不包含end,即如果start等于end,也不进行填充
     */
    if (newEnd > newStart && i >= newStart && i < newEnd) {
      this[i] = value
    }
  }
  return this
}

posted on 2024-12-22 17:47  shenhf  阅读(7)  评论(0编辑  收藏  举报

导航