Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:indexOf在高索引时速度慢,尽管数组稀疏?_Javascript_Arrays_Performance_Google Chrome_Indexof - Fatal编程技术网

Javascript:indexOf在高索引时速度慢,尽管数组稀疏?

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

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

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

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

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

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”]
),因此不会太贵。