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;
};

ES6 -- fill详解相关推荐

  1. ES6 Promise详解

    Promise是JS中进行异步编程的新解决方案. 从语法上来说:Promise是一个构造函数 从功能上来说:promise对象用来封装一个异步操作并可以获取其成功/失败的结果值 promise:启动异 ...

  2. ES6 -- find 详解

    find 基本使用 Array.prototype.find 返回第一个满足条件的数组元素 const arr = [1, 2, 3, 4, 5]; const item = arr.find(fun ...

  3. 最全ES6详解及用法

    最全ES6详解及用法 前言 babel babel使用方法 变量的定义 let.const this 和作用域 do 顶层对象 global对象 import class JS中的原型 原型语言 pr ...

  4. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  5. 【ES6】Module模块详解

    [ES6]Module模块详解 一.Module的由来 二.严格模式 三.export命令 四.import命令 查看更多ES6教学文章: 参考文献 引言:由于两个JS文件之间相互使用必须通过一个ht ...

  6. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  7. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  8. 【ES6】 let与const详解

    [ES6] let与const详解 ES6,全称为ECMAScript6.ES6与js的关系是:前者是后者的规格,后者是前者的实现.换句话说,ES是js的国际化版本,js是ES的子集. 1. let ...

  9. JS ES6中export和import详解

    1.Export 模块是独立的文件,该文件内部的所有的变量外部都无法获取.如果希望获取某个变量,必须通过export输出, // profile.js export var firstName = ' ...

最新文章

  1. f5 2017.09.03故障
  2. Linux基础命令---文本格式转换expand、unexpand
  3. OpenCV cv::Mat::checkVector用法的实例(附完整代码)
  4. spring-core
  5. 有var d = new Date(‘20xx-m-09‘),可以设置为m+1月份的操作是?
  6. spring boot 三种入参
  7. oracle客户端和ssh区别,oracle 使用SSH 转发功能
  8. 计算机专业课教学,计算机专业课教学的原则和方法
  9. 系统学习NLP(六)--语义分析
  10. ubuntu18使用wine安装TIM和微信
  11. 记一次js调试(attachEvent, onchange, onpropertychange)
  12. 区块链三加一告诉你如何快速了解区块链入门技术?
  13. 快速生成数据库文档--screw
  14. 程序员坐行李箱迎寒风编码 2 小时,目击者:激励我写了一篇论文!
  15. 0基础看-最大似然函数,原理,基本概念,例子
  16. 微博SDK第三方授权登陆
  17. linux 不自动进入睡眠,linux 7 为何自动睡眠
  18. iOS 开发: 仿QQ
  19. java开发之异常处理_SimpleMappingExceptionResolver
  20. 软件设计之——“高内聚低耦合”

热门文章

  1. PNG图片在IE6下透明度解决方法
  2. 北风:微信状态视频引流、变现实操经验分享
  3. 解决RabbitMQ admin账号登陆失败的问题
  4. 【计蒜客17293】【学校联考】CQYZ_Vijos_P3754 抢气球
  5. Java语言程序设计 例题11.1(Triangel类)
  6. echarts 地图去除点击事件_echarts 取消图例上的点击事件和图表上鼠标滑过点击事件...
  7. 发射频率对图像分辨率的影响
  8. 织梦dedecms如何去除版权中的Power by DedeCms
  9. Idea中的Facets 与 Artifacts
  10. 简约不简单的宝藏工具,每一款都非常实用