在JS数组中存储单个大索引是错误的吗?

时间:2014-12-09 10:03:33

标签: javascript jquery arrays callback

我有一个连接到我的js脚本的上传处理程序。

(这个上传处理程序是用c ++编写的,因此我无法传递js对象)

此上传处理程序启动上传并立即返回UID(基于当前时间戳,以毫秒为单位。如下所示:

var transferUid = fileTransfers.addFileTransfer(sourcePath,destination);

我想为此添加一个回调函数。 转移完成后。 完成后自动执行此js函数:

filetransfersfinished(uid){...}

做这样的事情是合理的:

var finishFunctions = [];
finishfunctions [transferUid] = function(){/*callbacks*/}

transferUid可能像184548178452 ......

并在调用自动​​函数时调用它:

filetransfersfinished(uid){  finishfunctions[uid]();  }

或者你能想到更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

回答问题

在chrome中使用堆分析工具,为小内容提供一个巨大的数组似乎不会导致问题或堆分配的高峰。

已确认here为"稀疏阵列与完整阵列",并与this jsperf确认。

实质上:稀疏数组很慢,但预计不会比对象属性慢。

无论如何,我建议您使用对象,因为它更直观:

回答您的具体案例

最好的方法是使用一个对象(javascript等同于"关联数组"),如注释中所指出的那样。 有很多方法可以做到这一点,但为了尽可能地保留你使用的语法,我会这样做:

var finishFunctions = {};
finishfunctions [transferUid.toString()] = function(){/*callbacks*/}

然后你的回调:

filetransfersfinished(uid){  finishfunctions[uid.toString()]();  }

注意:使用此方法,您可以为您的uid使用任何方便的格式,而不仅仅是数字。如果它对您有任何价值。