Javascript:indexOf在高索引时速度慢,尽管数组稀疏?
在我的站点上运行一些测试时,我得到了一个数组,其中只有10个字符串,但有一个索引非常高(600000) 在这个数组上运行indexOf非常慢,使得每个调用的整个选项卡都会冻结几秒钟 当我试图寻找这方面的信息时,大多数人似乎在说现代Javascript实现使用稀疏数组,这不应该是一个问题。我用的是最新的Chrome 62 这个问题实际上可以在开发者工具的控制台中重现。如果尝试运行以下代码:Javascript:indexOf在高索引时速度慢,尽管数组稀疏?,javascript,arrays,performance,google-chrome,indexof,Javascript,Arrays,Performance,Google Chrome,Indexof,在我的站点上运行一些测试时,我得到了一个数组,其中只有10个字符串,但有一个索引非常高(600000) 在这个数组上运行indexOf非常慢,使得每个调用的整个选项卡都会冻结几秒钟 当我试图寻找这方面的信息时,大多数人似乎在说现代Javascript实现使用稀疏数组,这不应该是一个问题。我用的是最新的Chrome 62 这个问题实际上可以在开发者工具的控制台中重现。如果尝试运行以下代码: test = []; test[600000000] = "test"; test.indexOf("tes
test = [];
test[600000000] = "test";
test.indexOf("test");
您将看到控制台需要几秒钟来返回索引,这表明Javascript在从0到600000000的每个索引中循环,而不是直接跳到一个元素。这是正常行为吗?我不确定这是否是“正常”行为,但一个简单的替代方法是:
function sparseIndexOf(arr, value) {
return Object.keys(arr).find(function(k) {
return arr[k] === value;
})
}
test = [];
test[600000000] = "test";
sparseIndexOf(test, "test")
是的,这就是JavaScript的工作方式这可能是一个帮助函数仍然需要调查每个索引。将来可能会有一段时间JavaScript运行时处理这种情况,但它们目前没有任何关系。这个链接是关于找到一个对象的索引。在我看来,ECMAScript规范为每个对象提供了相同的算法,将循环变量的长度增加1,并访问对象的每个属性。为什么会更快?当我在代理上调用它们时,它们的行为都如文档所示,访问每个属性的次数按1计算。巧妙的解决方法<代码>对象。键将返回一个实际包含值的索引数组(在本例中,将返回
[“600000000”]
),因此不会太贵。