gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:15:07 24 4
gpt4 key购买 nike

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

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

当我把它改成这个时,它运行没有问题

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

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

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

最佳答案

如您所见,您不应该为此使用数组,而应该使用对象。但是您应该更进一步,在顶层也使用一个对象。由于您的 2015073012 值将用作字符串,因此最好从一开始就将其设为一个字符串:

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

或:

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

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

(顺便说一句,我将名称从 resultArr 更改为 results 所以这个名称听起来不像是一个数组。)

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

不要被其他语言搞糊涂了,比如 PHP,它们只有一个 array 类型,它同时作为顺序 0,1,2,3,... 数组并作为键值对的字典。 JavaScript 既有数组也有对象:顺序情况使用数组,键值情况使用对象。

回到您的问题,为什么此代码会中断:

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

一种可能的解释是,当您为 [2015073012] 数组索引赋值时,JavaScript 引擎正在执行您告诉它要做的事情:它创建了一个包含 2,015,073,013< 的数组/strong> 个条目(比你给的值多一个,因为数组索引从 0 开始)。您的数组中有超过 20 亿 个条目!您可能会看到这将如何导致问题 - 这肯定不是您想要的。

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

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

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

但你没有那么幸运。在任何情况下,对于这种用途,您都应该始终使用对象而不是数组,以确保将它们视为键值对,而不是创建包含大部分为空元素的巨大数组。

关于javascript - 为什么具有非常高索引号的 javascript 数组会导致崩溃/减速/麻烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31738535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com