侧边栏壁纸
博主头像
woku博主等级

成功的路上并不拥挤

  • 累计撰写 50 篇文章
  • 累计创建 13 个标签
  • 累计收到 3 条评论

fill

woku
2021-11-16 / 0 评论 / 0 点赞 / 53 阅读 / 2,752 字

是什么

用一个固定的值来填充从开始下标到结束下标内的全部元素。注意:含头不含尾

var arr = [1, 2, 3, 4, 5]
var newArray = arr.fill('s', 0, 1)
console.log(newArray) //['s', 2, 3, 4, 5]

用‘s'这个值来填充从下标0到下标为1内的全部元素。

参数和默认值

fill(填充新值,开始下标,结束下标) [开始位置,结束位置) 开区间

填充新值:value 可选 默认填充undefined

开始下标:start 可选 默认为0

结束下标:end 可选 默认为this.length

几种特殊情况

  • 一个参数也没有,那么都会取默认值(默认从0开始一直覆盖到最后,值都为undefined)

    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill()
    console.log(newArray)  // [undefined, undefined, undefined, undefined, undefined]
    
  • 没有start和end 从0开始一直覆盖到最后 [0,e)

    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill('b')
    console.log(newArray) //  ["b", "b", "b", "b", "b"]
    
  • end >= length 一直覆盖到最后 或 end不存在 一直覆盖到最后

    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill('s', 1, 5)
    console.log(newArray) //  [1, "s", "s", "s", "s"]
    
    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill('s', 1)
    console.log(newArray) //  [1, "s", "s", "s", "s"]
    
  • 为负数 下标+this.length

    var arr = [1, 2, 3, 4, 5]
    newArray = arr.fill('c', -3, -1)  // -3 + 5 = 2     -1 + 5 = 4 fill('c',2,4)
    console.log(newArray) //  [1, 2, "c", "c", 5]
    
  • start == end 不变

    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill('s', 1, 1)
    console.log(newArray) //  [1, 2, 3, 4, 5]
    
  • start为非数字 ,那么从下标0开始

    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill('i', 'a', 4)
    console.log(newArray) //  ["i", "i", "i", "i", 5]
    
  • end为非数字 不变

    var arr = [1, 2, 3, 4, 5]
    var newArray = arr.fill('i', 1, 'a')
    console.log(newArray)  //  [1, 2, 3, 4, 5]
    
  • 下标为NaN:规则和下标为非数字的相同

    // start 和end都为NaN  不变
    newArray = arr.fill('z',NaN,NaN)
    // start为NaN [0,4)
    newArray = arr.fill('z',NaN,4)
    // end为NaN    不变
    newArray = arr.fill('zz',1,NaN)
    
  • 下标为null:规则和下标为非数字的相同

    注意:下标为非数字、NaN、null规则相同

    // start 和end都为null  不变
    newArray = arr.fill('f',null,null)
    // start为null [0,4)
    newArray = arr.fill('f',null,4)
    // end为null   不变
    newArray = arr.fill('f',1,null)
    
  • 下标为undefined

    • start 和 end都为undefined 全部覆盖

      var arr = [1, 2, 3, 4, 5]
      var newArray = arr.fill('w', undefined, undefined)
      console.log(newArray)  // ["w", "w", "w", "w", "w"]
      
    • start为undefined [0,3) 从0开始

      var arr = [1, 2, 3, 4, 5]
      var newArray = arr.fill('w', undefined, 3)
      console.log(newArray)  // ["w", "w", "w", 4, 5]
      
    • end为undefined 正常覆盖到最后

      var arr = [1, 2, 3, 4, 5]
      var newArray = arr.fill('w', 3, undefined)
      console.log(newArray)  // [1, 2, 3, "w", "w"]
      

注意: 下标为undefined时,规则和前面的非数字、NaN、null不同
注意:newArray是原数组的引用
使用 console.log(newArray === arr) 发现运行结果为true,newArray返回的是原数组的引用

自己封装fill方法

Array.prototype.myFill = function() {
    if(this == null) {
        throw new TypeError('this is null')
    }
    var value = arguments[0] || undefined,
    start = arguments[1] >> 0,
    end = arguments[2],
    obj = Object(this),
    len = obj.length >>> 0
    start = start !== 0 & (start > 0? Math.min(start,len):
            Math.max(start + len,0))
    end = end === undefined ? len: end >> 0
    end = end > 0 ? Math.min(end,len):
          Math.max(end + len,0)
    while(start < end) {
        obj[start] = value
        start++
    } 
    return obj
}

var ma = [8,5,6,7,4]
console.log(ma.myFill('a',1,null))
0

评论区