Javascript: indexOf медленный на высоком индексе, несмотря на разреженный массив?


Во время выполнения некоторых тестов на моем сайте, я получил массив, который имеет только 10 строк в нем, но один с очень высоким индексом (600 000 000).

Запуск indexOf на этом массиве очень медленный, заставляя всю вкладку зависать на несколько секунд для каждого вызова.

Когда я попытался найти информацию об этом, большинство, казалось, говорили, что современные реализации Javascript используют разреженный массив и что это не должно быть проблемой. Я использую последнюю версию Chrome 62.

Проблема в том, что фактически воспроизводится только в консоли инструментов разработчика. Если вы попытаетесь выполнить следующий код:

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

Вы увидите, что консоли требуется несколько секунд, чтобы вернуть индекс, указывая, что Javascript циклически перебирает каждый индекс от 0 до 600000000, а не переходит непосредственно к одному элементу. Это нормальное поведение?

1 3

1 ответ:

Я не уверен, что это" нормальное " поведение, но простой заменой будет:

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

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