ES6 -- fill详解

fill

Array.prototype.fill
fill方法实际上是根据下标范围来给范围内的元素覆盖新的值
左闭右开

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2, 4);
console.log(newArr);// [1, 2, 'a', 'a', 5]

当end 大于数组的长度的时候 覆盖到数组末尾

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2, 5);
console.log(newArr);//[1, 2, 'a', 'a', 'a']

newArr 就是原数组的引用

console.log(arr === newArr);//true

当只填写start 没有end 则覆盖到数组末尾

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2);
console.log(newArr);//[1, 2, 'a', 'a', 'a']

当 start 与 end 都部填写则全部覆盖

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a');
console.log(newArr);// ['a', 'a', 'a', 'a', 'a']

如果 start 和 end 是负数呢
start + len
end + len

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a',-4,-2);
console.log(newArr);//[1, 'a', 'a', 4, 5]

什么都不填呢
全部覆盖为undefined

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill();
console.log(newArr);// [undefined, undefined, undefined, undefined, undefined]

当 start 等于 end
不变

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 1, 1);
console.log(newArr);//[1, 2, 3, 4, 5]

当 start 与 end 是非数字
或者
end 是不是数字 start 是数字
不变

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 'c', 's');
console.log(newArr);//[1, 2, 3, 4, 5]
const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2, 'b');
console.log(newArr);//[1, 2, 3, 4, 5]

注意
当 start 为非数字 end 为数字
是[0, end)

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 'c', 4);
console.log(newArr);//['a', 'a', 'a', 'a', 5]

当 start 与 end 是NaN
或者
start 是数字 end 是NaN
不变

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', NaN, NaN);
console.log(newArr);//[1, 2, 3, 4, 5]
const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2, NaN);
console.log(newArr);//[1, 2, 3, 4, 5]

注意
当 start 为NaN end 是数字时
[0, end)

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', NaN, 4);
console.log(newArr);//['a', 'a', 'a', 'a', 5]

当 start 与 end 都为null
或 end 为null start是数字
不变

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2, null);
console.log(newArr);//[1, 2, 3, 4, 5]
const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', null, null);
console.log(newArr);//[1, 2, 3, 4, 5]

当 end 是数字 start是null
[0,end)

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', null, 4);
console.log(newArr);//['a', 'a', 'a', 'a', 5]

当 start end 都为undefined
全部覆盖

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', undefined, undefined);
console.log(newArr);//['a', 'a', 'a', 'a', 'a']

当 start 数字 end uindefined
start 到最后

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', 2, undefined);
console.log(newArr);//[1, 2, 'a', 'a', 'a']

当start undefined end 数字
[0, end)

const arr = [1, 2, 3, 4, 5];
const newArr = arr.fill('a', undefined, 3);
console.log(newArr);//['a', 'a', 'a', 'a', 5]

value 可选 默认填充undefined
start 可选 默认0
end 可选 默认 this.length

对象

const newObj = Array.prototype.fill.call({ length: 3 }, 4);
console.log(newObj);

在这里插入图片描述

创建类数组方法

可以使用fill包装成一个方法
创建一个类数组

function makeArrayLike(arr) {
  var arrLike = {
    length: arr.length,
    push: [].push,
    splice: [].splice,
  };
  arr.forEach(function (item, index) {
    [].fill.call(arrLike, item, index, index + 1);
  });
  return arrLike;
}
const newObj = makeArrayLike(['a', 'b', 'c', 'd', 'e']);
console.log(newObj);

在这里插入图片描述

function makeArrayLike(arr) {
  var arrLike = {
    length: arr.length,
    push: [].push,
    splice: [].splice,
  };
  arr.forEach(function (item, index) {
    [].fill.call(arrLike, item, index, index + 1);
  });
  return arrLike;
}
const newObj = makeArrayLike([
  {
    id: 1,
    name: '张三',
  },
  {
    id: 2,
    name: '李四',
  },
  {
    id: 3,
    name: '王五',
  },
]);
console.log(newObj);

在这里插入图片描述

实现myFill

Array.prototype.myFill = function () {
  var value = arguments[0] || undefined,
    start = arguments[1] >> 0,
    end = arguments[2];
  if (this == null) {
    throw new TypeError('This is null or not defined');
  }
  var obj = Object(this),
    len = obj.length >>> 0;
  start = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
  end = end === undefined ? len : end >> 0;
  end = end < 0 ? Math.max(len + end, 0) : Math.min(end, len);
  while (start < end) {
    obj[start] = value;
    start++;
  }
  return obj;
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_聪明勇敢有力气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值