当前位置: 首页 > article >正文

JavaScript 二维数组初始化:为什么 fill([]) 是个大坑?

JavaScript 二维数组初始化:为什么 fill([]) 是个大坑?

今天刷leetcode的时候,遇到一个神奇的bug。

当我修改数组中的一个元素,却意外影响了其他所有元素???。

问题重现:诡异的数组共享

const r = 3;
const mat = new Array(r).fill([]);
mat[0].push(1);
console.log(mat); // 输出什么?

我期望的输出可能是 [[1], [], []],但实际结果却是 [[1], [1], [1]]!所有子数组都被修改了。

为什么会这样???

引用类型的陷阱

在 JavaScript 中,数组是引用类型。当我们使用 fill([]) 时:

  1. 首先创建一个空数组 [](假设内存地址为 0x123)
  2. 然后将这个引用复制到新数组的每个位置

内存结构如下:

mat: [0x123, 0x123, 0x123]  │      │      │  ▼      ▼      ▼  [ ]    [ ]    [ ]  

所有元素都指向同一个数组对象!

与原始类型的区别

对比使用原始类型的情况:

const arr = new Array(3).fill(0);
arr[0] = 1;
console.log(arr); // [1, 0, 0] 表现正常

因为原始类型(如数字)是直接存储值,而非引用。

正确的初始化方式O(∩_∩)O~

方法1:循环初始化

const mat = new Array(r);
for (let i = 0; i < r; i++) {mat[i] = [];
}

方法2:使用 map(推荐)

const mat = new Array(r).fill().map(() => []);

或者更简洁的:

const mat = Array.from({ length: r }, () => []);

总结

  1. 永远不要用 new Array(n).fill([]) 初始化二维数组
  2. 引用类型在 fill() 中会被共享
  3. 使用 Array.from 或 map 确保每个子数组独立

啊啊啊啊啊哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇

相关文章:

JavaScript 二维数组初始化:为什么 fill([]) 是个大坑?

JavaScript 二维数组初始化&#xff1a;为什么 fill([]) 是个大坑&#xff1f; 今天刷leetcode的时候&#xff0c;遇到一个神奇的bug。 当我修改数组中的一个元素&#xff0c;却意外影响了其他所有元素&#xff1f;&#xff1f;&#xff1f;。 问题重现&#xff1a;诡异的数组…...

项目任务,修改svip用户的存储空间。

修改存储空间 3GB->5GB&#xff0c;这是项目任务&#xff0c;首先有人任务就要去思考实现思路&#xff0c;首先存储空间&#xff0c;也就是说不只是前端样式3GB改一下就可以了&#xff0c;那用户实际还是3GB&#xff0c;所以我们去网站看后端谁返回给我们了3GB&#xff0c;我…...

TypeScript 全面学习指南 (2025最新版)

TypeScript 全面学习指南 目录 TypeScript 简介环境搭建与工具基础类型变量声明接口&#xff08;Interfaces&#xff09;类&#xff08;Classes&#xff09;函数&#xff08;Functions&#xff09;泛型&#xff08;Generics&#xff09;枚举&#xff08;Enums&#xff09;类型…...

【redis】过期策略 懒惰删除

过期删除&#xff1a; redis会将所有设置过期时间的key以及过期时间存储在字典里。 redis采取两个策略实现删除过期key&#xff1a; 1、定时删除&#xff1a;定期扫描字典&#xff0c;采用贪心的策略&#xff0c;从字典随机抽20个key&#xff0c;删除其中已经过期的key&#x…...

Docker或Docker-Compose时间时区配置

Docker或Docker-Compose配置时区&#xff0c;主要是为了使用容器内的时间和物理机操作系统的时间保持一致。以下是集中配置Docker或Docker-Compose环境时间时区的方式。 Dockerfile&#xff08;Docker&#xff09;中配置时区 在Dockerfile中&#xff0c;可以通过如下方式添加…...

如何在IDE中通过Spark操作Hive

在IDE中通过Spark操作Hive是一项常见的任务&#xff0c;特别是在大数据处理和分析的场景中。本文将详细介绍如何在集成开发环境&#xff08;IDE&#xff09;中使用Apache Spark与Hive进行交互&#xff0c;包括必要的设置、代码示例以及详细解释。 环境准备 在开始之前&#x…...

ToolsSet之:XML工具

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Text菜单下的XML Tool工具是一个Xml工…...

keepalived定制日志bug

keepalived定制日志bug 源码安装apt安装endl 源码安装 在/etc/rsyslog.d/目录下创建 keepalived的日志配置文件keepalived.conf [rootubuntu24-13:~]# vim /etc/rsyslog.d/keepalived.conf [rootubuntu24-13:~]# cat /etc/rsyslog.d/keepalived.conf local6.* /var/log/keepa…...

ElasticSearch+Gin+Gorm简单示例

更多个人笔记见&#xff1a; &#xff08;注意点击“继续”&#xff0c;而不是“发现新项目”&#xff09; github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习&#xff0c;学习过程中还会不断补充&…...

数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)

数据库系统概论&#xff08;十三&#xff09;详细讲解SQL中数据更新 前言一、数据插入1. 插入数据是什么&#xff1f;2.插入单条数据&#xff08;插入元组&#xff09;场景 1&#xff1a;指定部分列插入场景 2&#xff1a;不指定列名&#xff08;插入所有列&#xff09;场景 3&…...

JVMTI 在安卓逆向工程中的应用

JVMTI 在安卓逆向工程中的应用 JVMTI 在安卓逆向工程中扮演着重要角色&#xff0c;尤其是在分析和修改 Java 层应用行为时。以下是其核心应用场景、实现方式及典型工具&#xff1a; 一、核心应用场景 1. 动态代码注入与 hook 通过 JVMTI 可以在运行时修改或拦截 Java 方法&…...

极客时间-《搞定音频技术》-学习笔记

极客时间-《搞定音频技术》-学习笔记 语音基础知识 https://www.zhangzhenhu.com/audio/feature.html 序章-0 作者说这个语音技术啊&#xff0c;未来肯定前景大好啊&#xff0c;大家都来学习&#xff0c;然后给出了课程的脑图 音频基础 什么是声音 声音的三要素是指响度、…...

网络攻防技术十三:网络防火墙

文章目录 一、网络防火墙概述1、网络型防火墙&#xff08;网络防火墙&#xff09;2、Web应用防火墙3、数据库防火墙4、主机防火墙&#xff08;个人防火墙&#xff09;5、网络防火墙的功能 二、防火墙工作原理1、无状态包过滤防火墙2、有状态包过滤防火墙&#xff08;状态检测/动…...

Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件

代码&#xff1a;express-exe: 将Express开发的js打包成exe服务丢给客户端使用 实现目标 Express 集成 Sequelize 操作 Sqlite3 数据库&#xff1b; 启动 Sqlite3 时默认开启 WAL 模式&#xff0c;避免读写互锁&#xff0c;支持并发读&#xff1b; 利用 Conf 实现主进程与 Ex…...

CppCon 2015 学习:A C++14 Approach to Dates and Times

Big Picture — 日期库简介 扩展 标准库 这个库是对 C 标准库中 <chrono> 的自然延伸&#xff0c;专注于处理“日历”相关的功能&#xff08;比如年月日、闰年、节假日等&#xff09;&#xff0c;而不仅仅是时间点和时长。极简设计 它是**单头文件&#xff08;header-on…...

基于CNN的OFDM-IM信号检测系统设计与实现

基于CNN的OFDM-IM信号检测系统设计与实现 摘要 本文详细研究了基于卷积神经网络(CNN)的正交频分复用索引调制(OFDM-IM)信号检测方法。通过在不同信噪比(SNR)和信道条件下进行系统仿真,对比分析了CNN检测器与传统最大似然(ML)检测器的误码率(BER)性能和计算复杂度。实验结果表…...

macos常见且应该避免被覆盖的系统环境变量(避免用 USERNAME 作为你的自定义变量名)

文章目录 macos避免用 USERNAME 作为你的自定义变量名macos常见且应该避免被覆盖的系统环境变量 macos避免用 USERNAME 作为你的自定义变量名 问题&#xff1a; 你执行了&#xff1a;export USERNAME“admin” 然后执行&#xff1a;echo ${USERNAME} 输出却是&#xff1a;xxx …...

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…...

深入理解CSS常规流布局

引言 在网页设计中&#xff0c;理解元素如何排列和相互作用至关重要。CSS提供了三种主要的布局方式&#xff1a;常规流、浮动和定位。本文将重点探讨最基础也是最常用的常规流布局&#xff08;Normal Flow&#xff09;&#xff0c;帮助开发者掌握页面布局的核心机制。 什么是…...

DOCKER使用记录

1、拉取镜像 直接使用docker pull <image>&#xff0c;大概率会出现下面的报错信息&#xff1a; (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …...

MYSQL中常见的函数和使用

字符串函数 CONCAT(str1,str2,...,strN) &#xff1a;用于将多个字符串连接成一个字符串。例如&#xff0c;SELECT CONCAT(SQL, , 函数) &#xff0c;结果为 “SQL 函数”。 LOWER(str) &#xff1a;将字符串中的所有字母转换为小写。例如&#xff0c;SELECT LOWER(MySQL Fun…...

【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署

目录 1. 查看自己电脑的cuda版本2.安装cuda关于环境变量的配置测试一下&#xff0c;安装完成 3.安装cuDVV环境变量的配置测试一下&#xff0c;安装完成 4.创建虚拟环境先安装镜像源下载3.11版本py 5.在虚拟环境下&#xff0c;下载pytorch6.验证是否安装成功7.在jupyter noteboo…...

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构

区块链基础&#xff1a;从区块添加机制到哈希加密与默克尔树结构 什么是区块链 抽象的回答: 区块链提供了一种让多个参与方在没有一个唯一可信方的情况下达成合作 若有可信第三方 > 不需要区块链 [金融系统中常常没有可信的参与方] 像股票市场&#xff0c;或者一个国家的…...

TCP小结

1. 核心特性 面向连接&#xff1a;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保通信双方状态同步。 TCP连接建立的3次握手 抓包&#xff1a; client发出连接请求&#xff1b; server回应client请求&#xff0c;并且同步发送syn连接&#xff1b; clien…...

django ssh登录 并执行命令

在Django开发环境中&#xff0c;通常不推荐直接通过SSH登录到服务器并执行命令&#xff0c;因为这违背了Django的架构设计原则&#xff0c;即前端与后端分离。Django主要负责处理Web请求、逻辑处理和数据库交互&#xff0c;而不直接执行系统级命令。然而&#xff0c;在某些情况…...

unix/linux,sudo,其高级使用

掌握了sudo的基石,现在是时候向更高阶的技巧和应用进发了!sudo的强大远不止于简单的sudo <command>。它的高级用法能让你在复杂的系统管理和安全场景中游刃有余,如同经验丰富的物理学家巧妙运用各种定律解决棘手问题。 sudo 的高级使用技巧与场景 精细化命令控制与参…...

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战

在 Python 开发中&#xff0c;创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml&#xff0c;并通过一个实际项目示例&#xff0c;展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…...

计算机视觉与深度学习 | 基于OpenCV的实时睡意检测系统

基于OpenCV的实时睡意检测系统 下面是一个完整的基于OpenCV的睡意检测系统实现,该系统使用眼睛纵横比(EAR)算法检测用户是否疲劳或瞌睡。 import cv2 import numpy as np import dlib from scipy.spatial import distance as dist import pygame import time# 初始化pygame用…...

python打卡day44@浙大疏锦行

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通过ctrl进入resnet的…...

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…...