Показать сообщение отдельно
  #37 (permalink)  
Старый 28.12.2008, 16:43
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Андрей Параничев
Интересно хеши в 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" (т.е. объект является "словарем"/ассоциативным массивом) также не однозначен в своей ассоциативности.

Поэтому, относительно терминологий, я думаю так: лучше (желательно) оперировать лаконичной терминологией конкретной технологии, но - можно использовать любую другую терминологию, лишь бы это однозначно уложилось в идеологию обсуждаемой технологии.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 28.12.2008 в 17:02.
Ответить с цитированием