为什么具有非常高索引号的 JavaScript 数组会导致崩溃/减慢/麻烦?

2024-03-22

基本上破坏我的 Node js Express 服务器的代码是这样的:

resultArr = [];
resultArr["test"] = [];
resultArr["test"][2015073012] = someObject;

当我将其更改为此时,它运行没有问题

resultArr = [];
resultArr["test"] = {};
resultArr["test"][2015073012] = someObject;

我确实是这样循环工作的。

为什么它破坏了我的应用程序?


正如您所发现的,您不应该为此使用数组,而应该使用对象。但您应该更进一步,在顶层也使用一个对象。自从你的2015073012value 将用作字符串,最好从一开始就将其设置为字符串:

var results = {};
results.test = {};
results.test['2015073012'] = someObject;

or:

var results = {};
results['test'] = {};
results['test']['2015073012'] = someObject;

现在您在任何 JavaScript 引擎中都不会有任何问题。

(顺便说一句,我把名字从resultArr to results所以这个名字听起来并不像是一个数组。)

JavaScript 数组适用于有连续条目的情况,例如array[0], array[1], array[2]等等。当你有任意字符串或任意大的数字作为键时,不要使用数组,而使用对象。

不要被其他语言所迷惑,例如 PHP,它们只有一个array类型既充当顺序0,1,2,3,...数组和键值对的字典。 JavaScript 同时具有数组和对象:对于顺序情况使用数组,对于键值情况使用对象。

回到你的问题,为什么did此代码中断:

resultArr = [];
resultArr["test"] = [];
resultArr["test"][2015073012] = someObject;

一种可能的解释是,当您为[2015073012]数组索引:它创建一个数组2,015,073,013条目(比您给出的值大一,因为数组索引从 0 开始)。就这样结束了二十亿数组中的条目!您可能会看到这会如何导致问题 - 但这肯定不是您想要的。

其他引擎可能会意识到这是一个大得离谱的数字,并将其视为字符串而不是数字,就好像您首先使用对象而不是数组一样。 (JavaScript 数组是also一个对象,可以有键值对以及数字索引。)

事实上,我祈祷并在最新版本的 Chrome 的 JavaScript 控制台中尝试了这一点,并且没有任何问题:

a = [];
a[2015073012] = {};

但你就没那么幸运了。无论如何,您应该始终使用对象而不是数组来进行此类用途,以确保将它们视为键值对,而不是创建包含大部分为空元素的巨大数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么具有非常高索引号的 JavaScript 数组会导致崩溃/减慢/麻烦? 的相关文章

  • Express+jade:局部变量在视图中不可用

    我遇到了一个非常基本的问题 但我似乎找不到答案 我正在与node js express我只是想将局部变量传递到视图中 如下所示 app get function req res res render index locals title B
  • 使用 jQuery live() 初始化插件?

    使用 jQuery 在特定类的所有当前和未来元素上自动初始化插件的最佳方法是什么 例如 假设我想要全部
  • Durandal SPA 与打字稿有关的问题

    我使用 TypeScript 1 8 将我的 durandal SPA 应用程序从 VS 2012 更新到 VS 2015 它将生成 JavaScript ECMA5 我解决了所有构建错误 但我无法修复一个名为 return 语句只能在函数
  • 如何使用 JavaScript 压缩文件?

    有没有办法使用 JavaScript 来压缩文件 例如 在雅虎邮件中 当您选择下载电子邮件中的所有附件时 它会被压缩并下载到单个 zip 文件中 JavaScript 能够做到这一点吗 如果是这样 请提供一个编码示例 我发现这个图书馆叫js
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 如何将 vue3-openlayers 插件添加到 nuxt

    我有以下 main ts 文件Vue3 https v3 vuejs org import createApp from vue import App from App vue How to do this in nuxt3 import
  • es6-module 默认导出导入为未定义

    我不确定我在这里缺少什么 我正在使用 jspm 和 es6 module loader 开发一个项目 我有一个模块定义如下 import hooks from hooks import api from api import tools f
  • 单击 btn 而不触发 div 单击未按预期工作

    代码沙盒 https codesandbox io s currying breeze depdc9 file package json https codesandbox io s currying breeze depdc9 file
  • 2 个 SVG 路径的交集

    我需要检查两个 SVG Path 元素是否相交 检查边界框与 getBBox 太不准确了 我目前正在做的是迭代两条路径 getTotalLength 然后检查是否有两个点 getPointAtLength 是平等的 下面是一个片段 但正如您
  • 如何在没有 jQuery 或延迟加载的情况下推迟背景图像

    根据帕特里克 塞克斯顿tutorial https varvy com pagespeed defer images html 我想以与这里相同的方式推迟背景图像img img src data image png base64 R0lGO
  • React setState回调返回值

    我是 React 新手 我希望实现这种流程 set the state execute a function f an async one which returns a promise set the state again return
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • 使标签充当输入按钮

    我怎样才能做一个 a href http test com tag test Test a 就像表单按钮一样 通过充当表单按钮 我的意思是 当单击链接执行操作时method get 或 post 以便能够通过 get 或 post 捕获它
  • JavaScript 中的安全数据

    我必须为 Web 测试创建生成器 使用 HTML 和 JavaScript 测试必须离线和在线进行 正确答案和分数评估必须是生成的测试的一部分 最终用户的分数仅发送到服务器 无法在服务器上进行评估 并且服务器对问题一无所知 它只保存最终分数
  • 从数组创建树并将父字段的表示形式更改为对象而不是 ID

    我堆满了琐碎的问题 但找不到解决方案 任何帮助将不胜感激 我有一个对象数组 id 1 title home parent null id 2 title about parent null id 3 title team parent 2
  • 反转比例函数

    这对我来说很有趣 看下面的D3代码 var scale d3 scale linear domain 100 500 range 10 350 scale 100 Returns 10 scale 300 Returns 180 scale
  • nvm代理设置配置文件

    在Linux下 我使用 http proxy and https proxy这适用于node and npm but nvm不使用它们 我应该在哪个配置文件中写入代理设置 uname a Linux Breizh Atao 3 19 0 3
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • 从 node.js 创建对 AWS ES 实例的有效签名请求

    我试图找到一个示例 说明如何连接到 Node js 中的 AWS ES 实例 然后通过一个简单的请求访问 ES 集群 我正在尝试使用elasticsearch节点包 https www npmjs com package elasticse
  • 运行 pm2 记录错误 SyntaxError: Unexpected token

    我想查看我的项目的日志 Steps 我克隆了一个套接字应用程序 然后我跑npm install pm2 g安装pm2 I run pm2 start 有用 它显示我的套接字应用程序的表格 但如果我跑pm2 logs查看日志 存在这样的错误

随机推荐