ES6中如何用数组的fill方法填充元素

fill()方法常见应用场景有四:1.创建并初始化固定长度数组;2.重置数组特定部分;3.算法中使用全值数组作为初始状态;4.填充占位符或默认值数组。例如new array(10).fill(0)快速生成十个零,gameboard.fill(null, 2, 5)清空棋盘部分区域,visitednodes = new array(100).fill(false)标记节点访问状态,placeholders = array(5).fill(‘待定’)生成默认占位数组。

ES6中如何用数组的fill方法填充元素

在ES6中,如果你想快速地用一个指定的值填充数组的全部或部分元素,Array.prototype.fill()方法就是你的得力助手。它直接在原数组上进行操作,非常高效。

ES6中如何用数组的fill方法填充元素

解决方案

fill()方法接受三个参数:value、start和end。

value: 用来填充数组的值。这是必填项。start: 可选参数,填充的起始索引(包含)。如果省略,默认为0。end: 可选参数,填充的结束索引(不包含)。如果省略,默认为array.length。

这个方法会修改原数组,并且返回被修改后的数组。

ES6中如何用数组的fill方法填充元素

举个例子:

// 填充整个数组const arr1 = [1, 2, 3, 4, 5];arr1.fill(0); // arr1 现在是 [0, 0, 0, 0, 0]console.log(arr1);// 填充部分数组const arr2 = ['a', 'b', 'c', 'd', 'e'];arr2.fill('x', 1, 4); // 从索引1开始,到索引4(不包含)结束// arr2 现在是 ['a', 'x', 'x', 'x', 'e']console.log(arr2);// 只指定起始索引const arr3 = [10, 20, 30, 40, 50];arr3.fill(99, 2); // 从索引2开始,填充到数组末尾// arr3 现在是 [10, 20, 99, 99, 99]console.log(arr3);// 负数索引:从数组末尾开始计算const arr4 = [1, 2, 3, 4, 5];arr4.fill(7, -3, -1); // 从倒数第三个(索引2)开始,到倒数第一个(索引4,不包含)结束// arr4 现在是 [1, 2, 7, 7, 5]console.log(arr4);

我个人觉得,这个方法最妙的地方就在于它的简洁性。你想想看,如果不用它,你可能得写个循环,或者用map之类的,但fill就直接很多,一行代码就能搞定很多初始化或者重置数组的任务。

ES6中如何用数组的fill方法填充元素

fill() 方法有哪些常见的应用场景?

fill()方法虽然看起来简单,但在实际开发中却有不少实用的场景。最直接的,当然是数组的初始化。比如,你需要一个固定长度的数组,并且每个元素都想先赋个默认值,new Array(length).fill(value)简直是天作之合。我经常用它来快速创建一个空的、但有预设大小的数组,比如在处理某些固定大小的数据块时,或者为后续的计算预留空间。

// 场景一:创建并初始化一个固定长度的数组const tenZeros = new Array(10).fill(0);// tenZeros: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]console.log(tenZeros);// 场景二:重置数组的特定部分const gameBoard = ['X', 'O', null, 'X', null, 'O', null, null, null];// 假设游戏结束,我们想清空棋盘的某个区域gameBoard.fill(null, 2, 5); // 清空索引2到4的区域// gameBoard: ['X', 'O', null, null, null, 'O', null, null, null]console.log(gameBoard);// 场景三:在某些算法中,需要一个全为某个值的数组作为初始状态const visitedNodes = new Array(100).fill(false); // 图遍历中标记节点是否访问过console.log(visitedNodes.slice(0, 5)); // 只看前5个// 场景四:填充新的数组,用于占位符或默认值const placeholders = Array(5).fill('待定');// placeholders: ['待定', '待定', '待定', '待定', '待定']console.log(placeholders);

它特别适合那些需要快速、批量地将数组元素统一为某个值的场景,减少了手动循环的繁琐。

fill() 方法与 Array.from() 或 map() 有何不同?

这是一个非常好的问题,因为它们都能对数组进行操作,但内在机制和适用场景却大相径庭。理解这些差异,能帮助你选择最合适的工具。

首先,最核心的区别在于可变性(Mutability)。

fill():它是一个原地修改数组的方法。这意味着它会直接改变调用它的那个数组。如果你不希望原始数组被修改,那么fill()可能不是最佳选择,或者你需要先创建一个副本。map():它是一个不可变的方法。map()会遍历数组的每个元素,并根据你提供的回调函数返回一个新的数组,而不会修改原数组。这是函数式编程中非常推崇的特性,因为它避免了副作用,让代码更可预测。Array.from():这个方法主要是用来从一个类数组对象或可迭代对象创建一个新的、浅拷贝的数组实例。它也可以接受一个映射函数,这样在创建新数组的同时,可以对元素进行转换。它同样不会修改原数据源。

再来看目的和功能:

fill():它的主要目的是用一个相同的值去填充数组。它不关心数组原有的元素是什么,只是简单地覆盖。map():它的目的是根据一个转换规则(回调函数)来生成一个新数组。每个新元素都由原数组对应元素经过转换而来,所以它更侧重于“转换”而非“填充”。Array.from():它的目的在于创建新数组。它可以从各种来源(如字符串、Set、Map、NodeList)创建数组,或者像new Array(length).fill(value)那样,但更灵活的是它能结合映射函数,在创建时就进行复杂的初始化。

const originalArr = [1, 2, 3];// 使用 fill() - 修改原数组const filledArr = [...originalArr]; // 先复制一份,避免直接修改originalArrfilledArr.fill(0);console.log('fill() 结果:', filledArr, '原数组:', originalArr); // fill() 结果: [0, 0, 0] 原数组: [1, 2, 3]// 使用 map() - 返回新数组,不修改原数组const mappedArr = originalArr.map(item => item * 2);console.log('map() 结果:', mappedArr, '原数组:', originalArr); // map() 结果: [2, 4, 6] 原数组: [1, 2, 3]// 使用 Array.from() - 创建新数组const newArrFromOriginal = Array.from(originalArr);console.log('Array.from() 结果:', newArrFromOriginal, '原数组:', originalArr); // Array.from() 结果: [1, 2, 3] 原数组: [1, 2, 3]// Array.from() 结合映射函数const newArrWithMap = Array.from({ length: 3 }, (_, i) => i + 10);console.log('Array.from() with map 结果:', newArrWithMap); // Array.from() with map 结果: [10, 11, 12]

选择哪个方法,完全取决于你的需求:是想原地修改,还是想生成一个新数组?是想用同一个值填充,还是想根据某种规则转换每个元素?

使用 fill() 方法时需要注意哪些潜在的“坑”?

虽然fill()方法用起来很方便,但它也有一些需要特别留心的地方,否则可能会踩到一些“坑”。我个人在使用它的时候,最常遇到的一个误区就是关于引用类型的值。

引用类型值的“浅拷贝”问题:这是最常见也是最容易让人困惑的地方。当你用一个对象(包括数组、对象字面量等)去填充数组时,fill()并不会为每个位置创建一个新的对象实例,而是将同一个对象的引用填充到数组的每个位置。这意味着数组中的所有元素都指向同一个对象。

const arrWithObject = new Array(3).fill({}); // 用一个空对象填充console.log(arrWithObject); // [ {}, {}, {} ]// 现在,尝试修改第一个元素里的属性arrWithObject[0].name = 'Alice';console.log(arrWithObject);// 结果是:[ { name: 'Alice' }, { name: 'Alice' }, { name: 'Alice' } ]// 所有的元素都被修改了!

你看,如果你期望每个元素都是独立的空对象,那这样就出问题了。因为它们都指向堆内存中的同一个对象实例。如果你需要每个元素都是独立的引用类型,你可能需要用Array.from()结合映射函数来创建:

const independentObjects = Array.from({ length: 3 }, () => ({}));independentObjects[0].name = 'Bob';console.log(independentObjects);// 结果是:[ { name: 'Bob' }, {}, {} ]// 这才是我们想要的效果,每个对象都是独立的。

对空位(Sparse Arrays)的处理:fill()方法会填充数组中的所有索引,包括那些在稀疏数组中可能存在的“空位”(empty slots)。它会把这些空位也填充上指定的值。

const sparseArr = [1, , 3]; // 索引1是空位sparseArr.fill(0);console.log(sparseArr); // [0, 0, 0]

这通常不是问题,但如果你依赖于空位的特性(比如在某些老旧代码或特定场景下),需要注意fill()会消除这些空位。

负数索引的计算:虽然我在前面提到了负数索引,但有时初学者会混淆它的计算方式。负数索引是从数组末尾开始计算的,-1表示最后一个元素,-2表示倒数第二个,以此类推。如果计算出的实际索引超出了数组范围,它们会被调整到0或array.length。

const myArr = [1, 2, 3, 4, 5];myArr.fill(99, -10); // -10 经过计算小于0,所以实际从索引0开始console.log(myArr); // [99, 99, 99, 99, 99]const anotherArr = [1, 2, 3, 4, 5];anotherArr.fill(88, 2, -10); // 结束索引-10经过计算小于起始索引2,所以不进行任何填充console.log(anotherArr); // [1, 2, 3, 4, 5]

当start大于或等于end时,fill()方法不会做任何操作。

总的来说,fill()是一个非常实用的方法,但关键在于理解它的原地修改特性,以及处理引用类型值时的“浅拷贝”行为。只要避开这些小“坑”,它就能大大提高你的开发效率。

以上就是ES6中如何用数组的fill方法填充元素的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1509276.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用Promise实现异步队列
上一篇 2025年12月20日 05:22:02
JavaScript模拟用户输入:为何input事件比键盘事件更关键?
下一篇 2025年12月20日 05:22:20

相关推荐

  • Bing浏览器怎么设置主页_Bing浏览器主页自定义与修改方法

    Bing浏览器怎么设置主页_Bing浏览器主页自定义与修改方法Bing浏览器怎么设置主页_Bing浏览器主页自定义与修改方法Bing浏览器怎么设置主页_Bing浏览器主页自定义与修改方法Bing浏览器怎么设置主页_Bing浏览器主页自定义与修改方法

    可通过四种方法设置Bing浏览器主页:一、在Microsoft Edge中通过图形界面开启主页按钮并输入网址;二、使用注册表编辑器在HKEY_LOCAL_MACHINE路径下创建HomepageLocation字符串值指定主页;三、通过组策略编辑器启用“配置主页”策略并填写URL(仅限专业版及以上系…

    2026年10月1日 • 用户投稿
    000
  • ECS台式机蓝屏BIOS版本错误怎么修复?完整指南带你恢复正常。

    ECS台式机蓝屏BIOS版本错误怎么修复?完整指南带你恢复正常。ECS台式机蓝屏BIOS版本错误怎么修复?完整指南带你恢复正常。ECS台式机蓝屏BIOS版本错误怎么修复?完整指南带你恢复正常。ECS台式机蓝屏BIOS版本错误怎么修复?完整指南带你恢复正常。

    蓝屏多因BIOS设置错误或版本不当,可尝试恢复默认设置、更新BIOS至正确版本、Clear CMOS硬重置或修正SATA模式来解决。 如果您的ECS台式机在启动过程中出现蓝屏,并且怀疑是由于BIOS版本错误或设置不当导致的,这通常意味着系统固件与硬件配置存在兼容性问题。以下是针对此问题的多种修复方法…

    2026年10月1日 • 用户投稿
    000
  • 在平板电脑上使用SublimeText进行开发的体验

    在平板电脑上使用SublimeText进行开发的体验在平板电脑上使用SublimeText进行开发的体验在平板电脑上使用SublimeText进行开发的体验在平板电脑上使用SublimeText进行开发的体验

    平板电脑上无法原生运行sublime text,但可通过远程连接实现使用。具体方法包括:①使用ssh客户端(如termius、blink shell)或vnc/rdp客户端连接远程服务器;②借助外接键盘和触控设备提升输入效率;③结合云端开发环境(如gitpod、codespaces)替代本地ide;…

    2026年10月1日 • 用户投稿
    100
  • windows提示默认网关不可用怎么办_默认网关不可用问题解决方法

    windows提示默认网关不可用怎么办_默认网关不可用问题解决方法windows提示默认网关不可用怎么办_默认网关不可用问题解决方法windows提示默认网关不可用怎么办_默认网关不可用问题解决方法windows提示默认网关不可用怎么办_默认网关不可用问题解决方法

    默认网关不可用可能是网络配置错误、驱动问题或电源管理导致。重启路由器和电脑可解决临时故障;重置TCP/IP协议栈恢复默认配置;更新或重装网卡驱动确保通信正常;禁用网卡电源节能防止自动关闭;手动设置IPv4参数绕过DHCP失败,按步骤操作可恢复网络连接。 如果您尝试连接网络,但系统提示“默认网关不可用…

    2026年10月1日 • 用户投稿
    000
  • 在JAR应用中显示控制台输出:System.out的可见性与重定向策略

    在JAR应用中显示控制台输出:System.out的可见性与重定向策略在JAR应用中显示控制台输出:System.out的可见性与重定向策略在JAR应用中显示控制台输出:System.out的可见性与重定向策略在JAR应用中显示控制台输出:System.out的可见性与重定向策略

    本文旨在解决Java JAR应用程序在双击运行时无法显示System.out输出的问题。我们将探讨为什么会出现这种现象,并提供两种主要解决方案:一是通过命令行启动JAR文件以直接在控制台显示输出,二是通过重定向标准输出流(System.out和System.err)将消息写入文件。文章还将对比两种方…

    2026年10月1日 • 用户投稿
    000
  • 华硕笔记本CPU过热关机?散热垫的使用建议

    华硕笔记本CPU过热关机?散热垫的使用建议华硕笔记本CPU过热关机?散热垫的使用建议华硕笔记本CPU过热关机?散热垫的使用建议华硕笔记本CPU过热关机?散热垫的使用建议

    首先清理散热系统灰尘,使用压缩空气清洁风扇和散热孔;其次正确使用匹配的散热垫并置于硬质平面;调整电源设置降低最大处理器状态至80%以减少发热;更新BIOS与驱动程序优化风扇控制逻辑;最后更换老化的导热硅脂以提升导热效率。 如果您在使用华硕笔记本电脑时遇到CPU过热导致自动关机的情况,这通常是由于散热…

    2026年10月1日 • 用户投稿
    100
  • 使用 Partytown 集成 Smartlook 的教程

    使用 Partytown 集成 Smartlook 的教程使用 Partytown 集成 Smartlook 的教程使用 Partytown 集成 Smartlook 的教程使用 Partytown 集成 Smartlook 的教程

    本文档旨在指导开发者如何正确地将 Smartlook 集成到使用 Partytown 的项目中。Partytown 旨在将耗时的第三方脚本转移到 Web Worker 中运行,从而提高主线程的性能。本文将提供必要的代码示例和步骤,帮助您成功集成 Smartlook 并避免常见问题。 集成步骤 以下步…

    2026年10月1日 • 用户投稿
    100
  • 电脑睡眠和休眠有啥区别

    电脑睡眠和休眠有啥区别电脑睡眠和休眠有啥区别电脑睡眠和休眠有啥区别电脑睡眠和休眠有啥区别

    睡眠与休眠的启动差异: 睡眠:系统会将当前运行的程序及已打开的文档暂存于电脑内存内,同时关闭其他设备。当按下任意按键唤醒时,电脑会回到睡眠前保存的状态继续工作。 休眠:系统会将内存中的数据复制到硬盘中并完全关机,下次开机时,系统会从硬盘中加载之前保存的内容到内存里,从而恢复到休眠前的工作环境。 睡眠…

    2026年10月1日 • 用户投稿
    000
  • java如何用int[]定义整数数组 java数组声明的基础语句教程

    java如何用int[]定义整数数组 java数组声明的基础语句教程java如何用int[]定义整数数组 java数组声明的基础语句教程java如何用int[]定义整数数组 java数组声明的基础语句教程java如何用int[]定义整数数组 java数组声明的基础语句教程

    声明数组变量:使用 int[] numbers; 或 int numbers[]; 定义一个可引用整数数组的变量;2. 创建数组对象:通过 numbers = new int[5]; 为数组分配内存,元素自动初始化为0;3. 声明并创建数组:合并步骤如 int[] scores = new int[…

    2026年10月1日 • 用户投稿
    100
  • 豆包AI如何辅助Android开发?快速构建移动应用界面

    豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面

    豆包ai在android开发中可作为高效助手,通过多种方式提升开发效率。1. 可快速生成xml布局代码,根据描述输出结构清晰的ui组件,如按钮栏、卡片列表等,并支持material design风格;2. 提供java/kotlin代码片段建议,如页面跳转、适配器编写,并解释关键逻辑;3. 推荐界面…

    2026年10月1日 • 用户投稿
    000
  • sublime如何运行前端代码 sublime执行html文件教程

    sublime如何运行前端代码 sublime执行html文件教程sublime如何运行前端代码 sublime执行html文件教程sublime如何运行前端代码 sublime执行html文件教程sublime如何运行前端代码 sublime执行html文件教程

    sublime text不能直接运行前端代码,因为它是一个文本编辑器而非集成开发环境。要运行html、css、javascript文件,需通过以下方法实现:1. 安装package control插件管理工具;2. 使用view in browser插件在浏览器中预览html文件;3. 手动配置su…

    2026年10月1日 • 用户投稿
    000
  • 作业帮怎么高效利用错题本_作业帮错题本学习提升技巧

    作业帮怎么高效利用错题本_作业帮错题本学习提升技巧作业帮怎么高效利用错题本_作业帮错题本学习提升技巧作业帮怎么高效利用错题本_作业帮错题本学习提升技巧作业帮怎么高效利用错题本_作业帮错题本学习提升技巧

    及时收录、定期回顾、精准突破是高效使用作业帮错题本的关键。1. 错题应立即拍照或手动录入,标注错误原因并按学科、知识点分类;2. 每周复盘,重做错题,标记二次出错项,利用打印功能手写巩固;3. 关联知识点与视频讲解,理解考点逻辑,观看微课查漏补缺,强化同类题训练;4. 制定攻克计划,结合考试节点梳理…

    2026年10月1日 • 用户投稿
    000
  • 如何让豆包AI处理Python中的字符串操作

    如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作

    豆包ai不能运行python代码,但能辅助编写和调试字符串操作。你可以描述具体需求,如提取邮箱、替换空格等,它会提供示例代码;可提问字符串方法区别、判断纯数字、格式化方式等常见问题;还可用于检查代码逻辑,如split与正则表达式的使用建议,提升字符串处理效率。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年10月1日 • 用户投稿
    000
  • win10登录界面输不了密码怎么办_win10无法输入密码登录修复方案

    答案:键盘无法输入密码时,可尝试进入安全模式重置启动配置、使用微软账户在线重置密码、通过命令提示符修改用户密码或检查筛选键与小键盘状态。 如果您在尝试登录Windows 10系统时,发现登录界面无法响应键盘输入,导致密码无法输入,这可能是由于系统服务异常、驱动冲突或设置错误引起的。以下是几种有效的修…

    2026年10月1日
    000
  • LenovoThinkPad修复蓝屏代码0x0000001E的完整方法。

    LenovoThinkPad修复蓝屏代码0x0000001E的完整方法。LenovoThinkPad修复蓝屏代码0x0000001E的完整方法。LenovoThinkPad修复蓝屏代码0x0000001E的完整方法。LenovoThinkPad修复蓝屏代码0x0000001E的完整方法。

    蓝屏错误0x0000001E通常由驱动冲突、硬件不兼容或内存问题引起,可尝试安全模式卸载新软件、清除第三方服务、检查内存连接、更新官方驱动或系统还原解决。 如果您在使用Lenovo ThinkPad时遇到蓝屏错误代码0x0000001E(KMODE_EXCEPTION_NOT_HANDLED),这通…

    2026年10月1日 • 用户投稿
    100
  • 《冲就完事模拟器2》定价维持一代不变 好评口碑继续

    《冲就完事模拟器2》定价维持一代不变 好评口碑继续《冲就完事模拟器2》定价维持一代不变 好评口碑继续《冲就完事模拟器2》定价维持一代不变 好评口碑继续《冲就完事模拟器2》定价维持一代不变 好评口碑继续

    开发发行商futurlab近日正式宣布,备受赞誉的解压游戏续作《冲就完事模拟器2》将延续前作定价策略,保持售价不变。在当前游戏普遍涨价的市场环境下,此举无疑赢得了玩家的广泛好评与认可。本作计划于2025年内正式发售,届时将登陆pc平台(包括steam、epic games store及microso…

    2026年10月1日 • 用户投稿
    100
  • 用豆包AI解析Python中的CSV文件数据

    用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据

    解析 csv 文件的核心方法包括使用 python 内置 csv 模块、pandas 进行结构化数据处理以及结合 ai 工具辅助调试和生成代码。1. 使用 csv 模块适合小规模数据,通过 reader 对象逐行读取,适用于无第三方依赖的场景;2. pandas 提供更高效的数据处理能力,支持列名识…

    2026年10月1日 • 用户投稿
    000
  • 利用SublimeText的宏功能自动化执行任务

    利用SublimeText的宏功能自动化执行任务利用SublimeText的宏功能自动化执行任务利用SublimeText的宏功能自动化执行任务利用SublimeText的宏功能自动化执行任务

    sublime text的宏功能通过录制并回放一系列操作,提升编辑效率。具体步骤为:1. 点击 tools – record macro 开始录制;2. 执行需要重复的操作,如加前缀、转换格式;3. 点击 tools – stop recording macro 停止录制;4…

    2026年10月1日 • 用户投稿
    100
  • Java Properties文件:通过部分键名灵活获取配置值

    Java Properties文件:通过部分键名灵活获取配置值Java Properties文件:通过部分键名灵活获取配置值Java Properties文件:通过部分键名灵活获取配置值Java Properties文件:通过部分键名灵活获取配置值

    针对Java Properties文件加载后无法直接通过部分键名获取值的场景,本文介绍了一种实用的解决方案。通过遍历所有属性键并利用字符串匹配方法,可以灵活地根据键的子串定位到所需的值,从而满足不完全匹配的查找需求,尤其适用于键名包含多个逻辑段的情况。 理解Java Properties文件与键名匹…

    2026年10月1日 • 用户投稿
    700
  • 蓝屏代码0x0000003b怎么解决_蓝屏代码0x0000003b修复指南

    蓝屏代码0x0000003b怎么解决_蓝屏代码0x0000003b修复指南蓝屏代码0x0000003b怎么解决_蓝屏代码0x0000003b修复指南蓝屏代码0x0000003b怎么解决_蓝屏代码0x0000003b修复指南蓝屏代码0x0000003b怎么解决_蓝屏代码0x0000003b修复指南

    0x0000003B蓝屏多由驱动、硬件或软件问题引起,解决方法依次为更新驱动、检查内存硬盘、排查软件冲突,并通过日志分析定位原因。 蓝屏代码0x0000003B通常指示系统在处理异常时遇到了问题,常见原因是驱动程序错误、硬件故障或软件冲突。解决办法通常涉及更新驱动、检查硬件和排查软件。 驱动更新、硬…

    2026年10月1日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信