【问题标题】:Javascript: indexOf slow on high index despite sparse array?Javascript:尽管数组稀疏,但 indexOf 在高索引上的速度很慢?
【发布时间】:2017-12-06 00:20:30
【问题描述】:

在我的网站上运行一些测试时,我最终得到了一个数组,其中只有 10 个字符串,但一个索引非常高 (600 000 000)。

在这个数组上运行 indexOf 非常慢,每次调用都会使整个选项卡冻结几秒钟。

当我试图寻找这方面的信息时,大多数人似乎都在说现代 Javascript 实现使用稀疏数组,这应该不是问题。我使用的是最新的 Chrome 62。

这个问题实际上可以在开发者工具的控制台中重现。如果您尝试运行以下代码:

test = [];
test[600000000] = "test";
test.indexOf("test");

您会看到控制台需要几秒钟才能返回索引,这表明 Javascript 正在循环遍历从 0 到 600000000 的每个索引,而不是直接跳到一个元素。这是正常行为吗?

【问题讨论】:

  • 是的,这就是 JavaScript 的工作原理
  • 这可能是一个帮助stackoverflow.com/questions/8668174/…
  • 该函数仍然需要调查每一个索引。将来 JavaScript 运行时可能会处理这种情况,但目前还没有。
  • @moon 没有任何关系。该链接是关于查找对象的索引。
  • 在我看来,ECMAScript 规范为每个都提供了相同的算法,将循环变量增加 1 到长度并访问对象的每个属性。为什么包含会更快?当我在 Proxy 上调用它们时,它们的行为都像记录的那样,访问每个属性计数为 1。

标签: javascript arrays performance google-chrome indexof


【解决方案1】:

我不确定这是否是“正常”行为,但一个简单的替代方法是:

function sparseIndexOf(arr, value) {
    return Object.keys(arr).find(function(k) {
        return arr[k] === value;
    })
}

test = [];
test[600000000] = "test";
sparseIndexOf(test, "test")

【讨论】:

  • 聪明的解决方法。 Object.keys 将返回一个实际包含值的索引数组(在这种情况下将返回 ["600000000"]),因此不会很昂贵。
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 2015-12-31
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多