为什么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等其他语言所迷惑,它们有一个单一的array
types,既可以作为一个连续的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具有大多数空元素的巨大数组。