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

基本上打破我的节点js表示服务器的代码是这样的:

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

当我改变这个,它运行没有问题

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

我做了这样一个循环。

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

如你所见,你不应该使用数组,你应该使用对象。 但是,您应该更进一步,并使用顶级对象。 而且由于你的2015073012价值将被用作一个string,所以从一开始就把它做成一个很好的习惯:

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

要么:

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

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

resultArr一下,我把resultArr的名字改成了results所以这个名字听起来不像是一个数组。

JavaScript数组适用于有序列条目(如array[0]array[1]array[2]等)的情况。对于键有任意string或任意大数字时,请勿使用数组,请使用对象。

不要被PHP等其他语言所迷惑,它们有一个单一的arraytypes,既可以作为一个连续的0,1,2,3,...数组,也可以作为键值对的字典。 JavaScript同时具有数组和对象:对于顺序大小写使用数组,对于键值大小写使用对象。

回到你的问题,为什么这个代码打破了:

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

一个可能的解释是,JavaScript引擎正在做你刚才告诉它做的事情,当你给[2015073012]数组索引赋值时:它会创build一个包含2,015,073,013个条目的数组(比给出的值多一个,因为数组索引启动在0)。 这是超过20亿条arrays! 你可能会看到这将会导致一个问题,而这当然不是你想要的。

其他引擎可能会意识到这是一个可笑的大数字,并将其视为一个string,而不是一个数字,就像您使用的是一个对象而不是一个数组。 (JavaScript数组也是一个对象,可以有键值对和数字索引。)

事实上,我跨过了我的手指,并在最新版本的Chrome浏览器的JavaScript控制台中尝试了这一点,并且没有任何问题:

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

但是你没有那么幸运。 在任何情况下,都应该使用对象而不是数组来进行这种使用,以确保将它们视为键值对,而不是创build具有大多数空元素的巨大数组。