Javascript:尽管数组稀疏,但 indexOf 在高索引上还是很慢?
Javascript: indexOf slow on high index despite sparse array?
虽然 运行 在我的网站上进行了一些测试,但我最终得到了一个数组,其中只有 10 个字符串,但索引非常高 (600 000 000)。
运行 这个数组上的 indexOf 非常慢,每次调用都会使整个选项卡冻结几秒钟。
当我尝试查找有关此的信息时,大多数人似乎都在说现代 Javascript 实现使用稀疏数组,这应该不是问题。我用的是最新的 Chrome 62.
该问题实际上仅在开发人员工具的控制台中重现。如果您尝试 运行 以下代码:
test = [];
test[600000000] = "test";
test.indexOf("test");
您会看到控制台需要几秒钟才能 return 索引,这表明 Javascript 循环遍历从 0 到 600000000 的每个索引,而不是直接跳到一个元素。这是正常行为吗?
我不确定这是否是 "normal" 行为,但一个简单的替换是:
function sparseIndexOf(arr, value) {
return Object.keys(arr).find(function(k) {
return arr[k] === value;
})
}
test = [];
test[600000000] = "test";
sparseIndexOf(test, "test")
虽然 运行 在我的网站上进行了一些测试,但我最终得到了一个数组,其中只有 10 个字符串,但索引非常高 (600 000 000)。
运行 这个数组上的 indexOf 非常慢,每次调用都会使整个选项卡冻结几秒钟。
当我尝试查找有关此的信息时,大多数人似乎都在说现代 Javascript 实现使用稀疏数组,这应该不是问题。我用的是最新的 Chrome 62.
该问题实际上仅在开发人员工具的控制台中重现。如果您尝试 运行 以下代码:
test = [];
test[600000000] = "test";
test.indexOf("test");
您会看到控制台需要几秒钟才能 return 索引,这表明 Javascript 循环遍历从 0 到 600000000 的每个索引,而不是直接跳到一个元素。这是正常行为吗?
我不确定这是否是 "normal" 行为,但一个简单的替换是:
function sparseIndexOf(arr, value) {
return Object.keys(arr).find(function(k) {
return arr[k] === value;
})
}
test = [];
test[600000000] = "test";
sparseIndexOf(test, "test")