Сообщение от Андрей Параничев
|
Интересно хеши в JavaScript в памяти организованы в виде хеш-таблиц?
|
Зависит от реализаций. Хеш - всего лишь терминология, подразумевающая разреженный массив, выполненный с помощью хеш-таблицы. К примеру, в Python он называется "словарь" (dictionary):
a = dict(a=10, b=20)
# равносильно
b = {'a': 10, 'b': 20}
print(a['a'], b['a']) # 10, 10
Однако, классовая модель Питона, схожа с делегирующей прототипной моделью JS (если свойство не найдено в самом объекте, его поиск продолжается в цепи классов). Таким образом, можно создать класс, унаследованный от
dict, и получить полную картину (за исключением небольших нюансов) JS относительно рассуждений выше об "ассоциативности". С одной стороны - это будет "словарь" (хеш/ассоциативный массив), с другой стороны - мы можем удалить свойство в объекте - "а оно, снова тут". Получается вышеописанная неоднозначность ассоциации.
# класс A, наследуемый от класса "словарь" (dict)
class A(dict): pass
# можно было объявить методы, для доступа к свойствам
# тогда бы можно было использовать обе конструкции a.prop и a['prop']
a = A() # инстанс
a.a = 10 # 10
A.a = 20 # классовое свойство, будет следующим в цепи поиска, если родное свойство не будет найдено
print a.a # 10
del a.a # удаляем
print a.a # 20 - удалили, а оно опять тут
Сообщение от x-yuri
|
Ведь на самом деле, Вы говорите, что есть абстрактное определение ассоциативного массива (множество пар ключ-значение), а есть терминология js (ассоциативный массив там отсутствует). Zeroglif же говорит, что есть терминология js, а все остальное не нужно и только запутывает. Т.е. Вас интересует "истина", у Zeroglif же более практический подход к делу.
|
Сложно здесь говорить однозначно, в виду размытости определений и понятий, стоящими за этими определениями; если удобно употреблять понятие "ассоциативный массив" - можно употреблять, но, относительно терминологии ECMA, это будет не верно (как не существует и понятия хеш в ней). Любой объект из ECMA подпадает под "ассоциативность". Между тем, на уровне реализаций - и "объект" и "массив" JS могут является и (из фундаментальных определений) "ассоциативным массивом", и (он же, подпадает по определение) - "разреженным массивом", и "хешем", и, "map'ом", и "деревом поиска" и (просто) "объектом" и т.д.
Сообщение от x-yuri
|
Почему бы не назвать объект ассоциативным массивом, если он используется только в таком ключе, т.е. никакие методы не вызываются?
|
Да там дело даже не в вызове методов. В том же Python'e - словарь может хранить по ключам методы:
a = {
'b': 10
'c': lambda: 20
}
a['b'] # 10
a['c']() # 20
Анализировалось понятие "ассоциативность". И, то ли у нас недостаточно знаний в четких фундаментальных определениях (и, действительно, где границы этой "ассоцитивности", если она столь нечеткая?), то ли, - еще что, но тогда "ассоциативностью" обладают все следующие определения при условии четкой выдачи значения по ключу:
- массив
- объект
- разреженный массив
- ассоциативный массив
- хеш
- список
- словарь
- map
- др.
Но, как видно из примера выше с Python'ом, - объект, порожденный от класса, наследуемого от класса "dict" (т.е. объект является "словарем"/ассоциативным массивом) также не однозначен в своей ассоциативности.
Поэтому, относительно терминологий, я думаю так:
лучше (желательно) оперировать лаконичной терминологией конкретной технологии, но - можно использовать любую другую терминологию, лишь бы это однозначно уложилось в идеологию обсуждаемой технологии.