JavaScript 数组填充方法 Array.fill()

2024-04-03 07:04

本文主要是介绍JavaScript 数组填充方法 Array.fill(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 前言

项目开发中,我们经常会定义具有特定长度的初始化数组,数组中的每一项元素默认为 empty 空位占位

 
  1. const arr = new Array(3)
  2. console.log(arr); // [空属性 × 3]

如果对数组这些空位添加默认的元素,ES6 提供了 fill() 方法实现这一操作,本文详细总结 fill() 方法的使用

 
  1. const arr = new Array(3).fill(0)
  2. console.log(arr); // [0, 0, 0]
2. fill() 语法

fill() 方法用一个固定值填充一个数组从起始索引到终止索引内的全部元素,不包含终止索引

返回修改后的数组,不修改原数组。使用语法:array.fill( value [,start [,end] ] )

 
  1. const arr = ['a', 'b', 'c', 'd', 'e']
  2. arr.fill('**'); // ['**', '**', '**', '**', '**']
  3. arr.fill('**', 2); // ['a', 'b', '**', '**', '**']
  4. arr.fill('**', 2, 4); // ['a', 'b', '**', '**', 'e']
3. fill() 陷阱

在 JS 中可以使用 new Array(n).fill() 快速创建一个数组并填充默认值

快速场景一个用 0 填充的数组:

 
  1. const arr = new Array(3).fill(0)
  2. console.log(arr); // [0, 0, 0]

如果想要创建一个用对象填充的数组的话,自然也想到这种用法

 
  1. const arr = new Array(2).fill({ id: "", name: "" })
  2. // [
  3. // { "id": "", "name": "" },
  4. // { "id": "", "name": "" },
  5. // ]
  6. console.log(arr);

表面上看似确实创建了一个用空对象填充的数组对象,然而实际上存在一个巨大的坑

因为是使用同一个对象来填充数组的,而对象是引用类型,会造成数组中所有的对象都是连动的,即: 牵一发而动前身

 
  1. const arr = new Array(2).fill({ id: "", name: "" })
  2. arr[0].id = 1
  3. // [
  4. // { "id": 1, "name": "" },
  5. // { "id": 1, "name": "" },
  6. // ]
  7. console.log(arr);

综上所述:很遗憾,数组填充基本数据类型是没有问题的,填充对象则需要手动实现,建议自定义个原型方法

 
  1. /**
  2. * 数组填充增强(支持引用类型)
  3. **/
  4. Array.prototype.fillPlus = function (item) {
  5. // 深拷贝
  6. function copy(object) {
  7. let data = object instanceof Array ? [] : {}
  8. for (const [key, value] of Object.entries(object)) {
  9. data[key] = typeof value == 'object' ? copy(value) : value;
  10. }
  11. return data
  12. }
  13. // 手动填充数据
  14. const data = []
  15. for (let index = 0; index < this.length; index++) {
  16. data[index] = copy(item);
  17. }
  18. return data
  19. }
  20. // 数组中的对象不会有连动了
  21. const arr = new Array(3).fillPlus({ name: "", list: [] })

这篇关于JavaScript 数组填充方法 Array.fill()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/872215

相关文章

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos