Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 27.12.2008, 14:49
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Zeroglif,

Есть вещи, о которых нас интересуют лишь общие сведения, и нам достаточно общего мэйнстримового мнения по ним, есть, которые мы хотим знать глубже, и уже просто на веру "лозунги" не принимаем. И оно так интересней

Плохо только то, что оперируют этими лозунгами часто те, для кого некая вещь относится к первой группе (на то они и мэйнстримовые лозунги; хотя, в самом мэйнстриме и его понятиях/лозунгах ничего плохого нет, а чаще - наоборот - я полагаю (нет, даже - искренне верю), что формируют их не те, кто совсем уж не разбирается в предмете).

К примеру, любой из вышеперечисленных лозунгов может быть оспорен (в плане сравнения со схожими идеологиями, и выделением частных случаев) и одновременно являться верным. Как частность - все та же динамическая классовая модель Python'a, которую я не ленюсь приводить в сравнении прототипной моделью JS (когда звучит громко второй лозунг) - разница минимальная. Но это вовсе не значит, что я говорю - смотрите, в JS есть классы, я лишь предостерегаю от выкрикивания этих самых лозунгов, когда смысл понят лишь на поверхности.

А в целом - беседа с тобой, как всегда, не проходит зря
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 27.12.2008 в 14:54.
Ответить с цитированием
  #32 (permalink)  
Старый 27.12.2008, 17:55
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

а к чему собственно спор пришел?
Ответить с цитированием
  #33 (permalink)  
Старый 27.12.2008, 17:55
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

ну т.е. может итоги подвести? какие доводы за/против?
Ответить с цитированием
  #34 (permalink)  
Старый 27.12.2008, 20:06
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

x-yuri, какой спор? Спора однозначно никакого не было.

Выводы можно сделать такие: если есть желание знать и понимать глубже технологию, которая тебя интересует, нужно, во-первых - изучать общие закономерности (чтобы не просто повторять громкие "лозунги"), и видеть эти закономерности в этой технологии, а во-вторых, - оперируя контекстом данной технологии, нужно мыслить ее терминологией и идеологией.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #35 (permalink)  
Старый 28.12.2008, 08:53
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

не было спора? я понял, это была светская беседа высокообразованных людей ;-)

какие-то выводы слишком абстрактные получились. Ведь на самом деле, Вы говорите, что есть абстрактное определение ассоциативного массива (множество пар ключ-значение), а есть терминология js (ассоциативный массив там отсутствует). Zeroglif же говорит, что есть терминология js, а все остальное не нужно и только запутывает. Т.е. Вас интересует "истина", у Zeroglif же более практический подход к делу.

Но есть один нюанс. Зачем нужны абстракции, чтобы отбросить детали и упростить дальнейшие рассуждения. Почему бы не назвать объект ассоциативным массивом, если он используется только в таком ключе, т.е. никакие методы не вызываются? Другое дело что это может запутать собеседника.

Поэтому я считаю, что термин ассоциативный массив имеет место быть при обсуждении задач, решаемых с помощью js, причем не теоретическом, а практическом.
Ответить с цитированием
  #36 (permalink)  
Старый 28.12.2008, 14:43
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Интересно хеши в JavaScript в памяти организованы в виде хеш-таблиц?
Ответить с цитированием
  #37 (permalink)  
Старый 28.12.2008, 15: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 в 16:02.
Ответить с цитированием
  #38 (permalink)  
Старый 28.12.2008, 18:52
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

кстати, в педивикии сказано, что
Цитата:
Most modern scripting languages, starting with awk and including Perl, tcl, Javascript, Python, and Ruby, support associative arrays as a primary container type.
Цитата:
Likewise, in JavaScript, all objects are associative arrays.
и на самом деле они правы, потому что никто не говорил, что ассоциацию нельзя "удалить", вопрос только в том, как это сделать: удалить свойство объекта или надо будет еще и у прототипов поудалять такие же свойства

Последний раз редактировалось Андрей Параничев, 28.12.2008 в 19:23. Причина: Пожалуйста, не отвечайте в одну тему несколько раз подряд - редактируйте свои предыдущие сообщения.
Ответить с цитированием
  #39 (permalink)  
Старый 28.12.2008, 19:43
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

но спорить на тему, что такое ассоциативный массив очень сложно, потому что я не знаю достоверного источника информациипо этому вопросу. Я видел 2 мнения: 1) набор ассоциаций, 2) массив, у которого в качестве индексов могут быть не только числа. Скорее всего было так: сначала массив пропатчили, и у него появилась возможность использовать не только числа в качестве индексов. А потом его пропатчили так, что его и не узнать уже ;-) все что осталось, так это возможность получить значение по ключу.

Но зачем вообще спорить об этом. Если необходимо указать собеседнику, что данная переменная содержит набор значений, доступных по ключу, то следует использовать "ассоциативный массив". Если же переменная обладает поведением - то это объект

Цитата:
Почему бы не назвать объект ассоциативным массивом, если он используется только в таком ключе, т.е. никакие методы не вызываются?

Да там дело даже не в вызове методов. В том же Python'e - словарь может хранить по ключам методы:
какая разница: методы - элементы массива, а не ключи
Ответить с цитированием
  #40 (permalink)  
Старый 28.12.2008, 20:50
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от x-yuri
Если необходимо указать собеседнику, что данная переменная содержит набор значений, доступных по ключу, то следует использовать "ассоциативный массив". Если же переменная обладает поведением - то это объект
А в каких языках используется именно эта терминология (ассоциативный массив)? Точно в PHP, а еще где? В JavaScript - объекты (Object, Array, String, RegExp, Boolean, Function и т.д.), в Ruby - Hash'ы (тоже все объекты, но выделен класс Hash), в Python - dict'ы (тоже все объекты - см. пример выше, но выделен класс dict), в Java - HashMap'ы. При этом, все это, опять обобщённо может называться "ассоциативный массив".

Насчет "если переменная обладает поведением - то это объект" - тоже - лишь личная версия. Повторю - в Python'e (как и в JS) - по ключу может быть функция, но вместе с тем это остается словарем (объектом-словарем). В Ruby, например, ключом может быть другой Hash:

a = {:a => 1, :b => 2}
b = {a => 3, :c => 4} #  {{:a=>1, :b=>2}=>3, :c=>4}


Вообще, ключом в хеше может быть все, что угодно, что хешируемо (hashable), т.е. возвращается значение, вычисленное некой хеш-функцией (из глоссария Питона - http://docs.python.org/3.0/glossary.html#term-hashable)

В общем, что можно сказать точно - так это то, что это очень размыто и точно сказать очень сложно.

Также верно то, что использование терминологии конкретной технологии тоже более предпочтительно. Иначе, зачем одни называют это "словарями", другие "ассоциативными массивами", другие "хешами"? - ну называли бы одинаково. К примеру, Руби развился из Питона, в Питоне - называется "словарь", - почему создатель Руби не использовал эту же терминологию?

А в Википедии, тоже часто субъективные статьи, так в Associative arrays некто пишет, что в JS все контейнеры - ассоциативные эррэи, в JavaScript syntax (там же, Википедия) уже кто-то пишет: "JavaScript objects are often mistakenly described as associative arrays or hashes, but they are neither." Класс, ага - и дальше ни слова об этом =) Так и хочется спросить - почему? Откуда он это взял? Откуда взяли те, кто писал статью про Associative arrays? Получается, каждый пишет, что захочет? Но что-то же должно быть эталоном? Вероятно, все же, таковым должна являться спецификация технологии (и в данном случае, это ECMA). Поэтому, на вопрос "Откуда он это взял?" - ответ будет - "из спецификации, там такого нет". Если же копать глубже - однозначных ответов не будет.

Сообщение от x-yuri
Скорее всего было так: сначала массив пропатчили, и у него появилась возможность использовать не только числа в качестве индексов. А потом его пропатчили так, что его и не узнать уже ;-) все что осталось, так это возможность получить значение по ключу.
Про разреженные массивы можно тут (на русском) почитать - http://lord-n.narod.ru/download/book...po_C/23/23.htm, и, в частности, реализация на хеш-таблицах - http://lord-n.narod.ru/download/book..._C/23/2305.htm; и в русской Википедии - разрежённый массив, который ссылается на "ассоциативный массив", как реализацию (в свою очередь, ассоциативный массив ссылается на хеш-таблицу, как на одну из реализаций).
__________________
Тонкости ECMAScript

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что означает ошибка "Отсутствует исполняющее ядро ДЛЯ расширения имени файла js" Mattias Общие вопросы Javascript 6 15.02.2021 12:16
Что за конструкция? (из jQuery) Yojik Общие вопросы Javascript 6 22.08.2010 14:46
Что такое "javascript:document.login.submit()" i_live_in_Moscow Общие вопросы Javascript 21 30.09.2008 14:25
Как сделать, что бы изображения пропадали. Dronch Элементы интерфейса 7 28.08.2008 20:55
Что за tagName? partyzan Общие вопросы Javascript 1 24.04.2008 20:29