Как делают массивы в работе JavaScript? (т.е. без стартового размера размера)

Вместо добавления используйте равный "="

from iptcinfo3 import IPTCInfo

info = IPTCInfo('Gus.jpg')
print(info['keywords'])

# add keyword
info['keywords'] = ['new keyword']

info.save()
info.save_as('Gus_2.jpg')
7
задан Community 23 May 2017 в 12:08
поделиться

6 ответов

Хм. Необходимо различать массивы и ассоциативные массивы.

массивы:

A=[0,1,4,9,16];

ассоциативные массивы:

B={a:'ha',b:27,c:30};

У первого есть длина, последний не делает. Когда я выполняю это в оболочке JavaScript, я добираюсь:

js>A=[0,1,4,9,16];
0,1,4,9,16
js>A instanceof Array
true
js>A.length
5
js>B={a:'ha',b:27,c:30};
[object Object]
js>B instanceof Array
false
js>B.length
js>

Как массивы "работа" в JavaScript являются зависящими от реализации. (Firefox и Microsoft и Opera и Google Chrome все использовали бы различные методы), Мое предположение, они (массивы, не ассоциативные массивы) используют что-то как станд. STL:: вектор. Ваш вопрос:

как память выделяется, чтобы массив все еще обеспечил O (1) время доступа, так как 'сумма' ячеек памяти не указана заранее?

больше вроде как станд.:: вектор (или подобные массивы изменяемого размера) работы. Это перераспределяет к большему массиву по мере необходимости. Вставки в конце берут амортизируемый O (1) время, а именно, при вставке элементов N, где N является большим, общее время берет N*O (1). Те, которых вводит человек, где это действительно должно изменить размер массива, могут занять больше времени, но в среднем это берет O (1).

4
ответ дан 7 December 2019 в 07:51
поделиться

Массивы в JavaScript являются "фальшивкой". Они реализованы, поскольку хеш отображается. Таким образом в худшем случае их время доступа не является O (1). Им также нужно больше памяти, и можно использовать любую строку в качестве индекса массива. Вы думаете, что это странно? Это.

2
ответ дан 7 December 2019 в 07:51
поделиться

JavaScript не имеет никаких действительных массивов. Элементы выделяются, поскольку Вы определяете их.

Это - гибкий инструмент. Можно использовать во многих целях, но поскольку инструмент общего назначения не так эффективен как массивы особого назначения.

0
ответ дан 7 December 2019 в 07:51
поделиться

Как я понимаю, это похоже на это:

В JavaScript существует две разных вещи: Массивы и Объекты. Они оба действуют как хеш-таблицы, хотя конкретная реализация характерна для каждого времени выполнения. Различие между этими двумя - то, что Массив имеет неявное length свойство, в то время как объект не делает. Иначе можно использовать [] или . синтаксисы для них обоих. Да, это означает, что объекты могут иметь числовые свойства, и массивы имеют индексы строк.Нет проблем. Хотя length свойство не могло бы быть тем, что Вы ожидаете при использовании таких приемов или разреженных массивов. Необходимо полагаться на него, только если массив не является разреженным, и индексы запускаются от 0.

Что касается производительности - извините, это не O (1), Вы ожидали бы. Как указано прежде - это - на самом деле конкретная реализация. Но в общем случае не возможно гарантировать, что будет O (1) производительность для всех операций в хеш-таблице. Тем не менее я ожидал бы, что достойные реализации должны иметь в распоряжении довольно много оптимизации для стандартных случаев, которые сделали бы производительность вполне близко к O (1) согласно большинству сценариев. Но во всяком случае - хранение огромных объемов данных в JavaScript не является мудрой идеей.

1
ответ дан 7 December 2019 в 07:51
поделиться

Это - то же в PHP. Я произошел из среды PHP/Javascript, и определяющие размерность массивы действительно получили меня, когда я перешел на другие языки.

0
ответ дан 7 December 2019 в 07:51
поделиться

Как Jason сказал, если это явно не указано стандартом ECMAScript (вряд ли), это является зависящим от реализации. Статья, показанная Ногами, показывает, что реализация IE была плоха (пока IE8?), который подтвержден производительностью цикла JavaScript.

Другие механизмы JS, вероятно, проявляют более прагматический подход. Например, они могут сделать как в Lua, имея истинную часть массива и часть ассоциативного массива: если массив является плотным, он живет в истинном массиве (который может все еще быть расширен за счет перераспределения), и у Вас могут все еще быть редкие высокие индексы, живущие в ассоциативной части.

Таким образом у Вас есть лучший из двух миров, скорость доступа к плотным частям и низкому использованию памяти для редких частей.

0
ответ дан 7 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: