Доступ к одному элементу массива или свойству объекта займет примерно одинаковое время независимо от размера.
Добавление данных будет отличаться в зависимости от того, о чем мы говорим. массив или объект, не являющийся массивом, и где и как вы добавляете данные.
Я не могу говорить о специфике какого-либо конкретного механизма JavaScript, но обычно реализации массивов переменной длины имеют две разные длины : выделенная длина и текущая длина. Свойство array.length
, которое вы видите в JavaScript, - это текущая длина, но память, выделенная для массива, часто больше этого. Например, массив из 100 элементов может фактически выделить достаточно места для 128 элементов.
Поэтому, когда вы вызываете array.push()
, в данных массива уже может быть дополнительное место. Это дело очень быстрое. Коду нужно только увеличить .length
и сохранить новый элемент массива.
Это причина выделения места для большего количества элементов, чем текущая длина: чтобы избежать необходимости перераспределять память на каждые .push()
.
Однако, как только текущая длина достигает выделенной длины, следующая .push()
должна перераспределить весь массив и обычно должна скопировать все предыдущие элементы массива в новую ячейку памяти. Это делает этот конкретный .push()
намного медленнее. Однако последующие вызовы .push()
будут быстрыми, пока текущая длина снова не достигнет выделенной длины.
В некоторых случаях перераспределение может происходить на месте - может случиться, что нераспределенное пространство окажется сразу после окончания массив, поэтому он может расширяться без копирования, но это менее распространенный случай. на 1,5 или как угодно.
А что, если вы используете array.unshift()
или array.splice()
для вставки одного или нескольких элементов в начало массива или рядом с ним? В этом случае, даже если в выделенной длине массива есть место для дополнительных элементов, скорость будет зависеть от текущей длины массива, потому что все существующие элементы после точки вставки должны быть перемещены в память.
Это меньше фактор для объекта, не являющегося массивом. Добавление нового свойства, независимо от его ключевого значения, не требует перемещения всех существующих свойств. Это может быть несколько медленнее для объекта с большим количеством свойств, но не так, как добавление элементов в начале массива. Объекты реализованы с помощью таблицы ha sh или аналогичной структуры данных. Механизм может решить перераспределить таблицу ha sh, чтобы увеличить ее, когда существует слишком много конфликтов ha sh (ключи, которые сопоставляются с одним и тем же значением ha sh), но это будет примерно таким же, какое бы значение ключа вы добавляете. Здесь не имеет значения, является ли ключ «меньше» или «больше» любого из существующих значений.
Если у вас есть дополнительные c вопросы, мы можем их продолжить.