Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что означает конструкция ? (https://javascript.ru/forum/misc/2414-chto-oznachaet-konstrukciya.html)

Zeroglif 27.12.2008 00:11

Внутренняя реализация не канает, их сотни. Все объекты ассоциативны, "ключи" заданы строками. Отсюда, если к массиву начинают приклеивать прилагательное ассоциативный, то его пытаются вычленить из кучи, а он такой же ассоциативный, как и любой другой объект.

Dmitry A. Soshnikov 27.12.2008 00:39

Цитата:

Сообщение от Zeroglif
Внутренняя реализация не канает, их сотни.

Именно поэтому и уточняю, чтобы не было недоразумений.

Цитата:

Сообщение от Zeroglif
Все объекты ассоциативны, "ключи" заданы строками

Ну ассоциация не обязательно подразумевает ключ-строку; обычный массив с числовыми ключами - частный случай ассоциативного (опять же - только в теории, не касаемо реализаций и терминологий конкретных технологий)

Zeroglif 27.12.2008 11:54

Цитата:

Сообщение от Dmitry A. Soshnikov
Ну ассоциация не обязательно подразумевает ключ-строку

Тогда нужно вернутся к истокам и определится с тем, что такое вообще ассоциативный массив. Что ты вкладываешь в это прилагательное по отношению к js?

Dmitry A. Soshnikov 27.12.2008 12:40

Цитата:

Сообщение от Zeroglif
что такое вообще ассоциативный массив

Это такой же обычный абстрактный тип данных, не более. Кем-то так названный. Вообще, ассоциация (в философии) подразумевает, что по событию A, выдается событие B. Т.е. А - ключ к B. Отсюда назвали структуру - "ассоциативный массив", где ключ - любое "событие". В чем отличие от обычного массива? Формально - ни в чем. По событие "0" (индекс) массива - выдается "событие" "10" (значение). Физически же по факту - разница есть - в реализации.

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

И в Си (да и в Asm'e), например, - это всего лишь - "получить данные по адресу База + НомерСмещения * РазмерТипаДанных":

*(Base + Index)

при этом запись вида Base[Index] - всего лишь синтаксический сахар для этой конструкции (не более).

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

Если использовать просто понятие "ассоциативность", то разница (опять же - касаться внутренних реализаций не стоит) между "структурой", "объектом", и "ассоциативным массивом" - не значительная - и там, и там, и там - мы имеем: "найди в Оболочке (Базе) событие B, вот тебе для этого ключ А". Физически, конечно все это отличается (структура, например, статическая, тогда как в "ассоциативный массив" можно добавлять значения динамически; хотя, динамичность - здесь, конечно, не главное).

Точного определения я не могу дать (здесь можно к любому слову прикопаться и сказать, что что-то уже не соответствует этим рамкам).

Цитата:

Сообщение от Zeroglif
Что ты вкладываешь в это прилагательное по отношению к js?

Я-то уж не вкладываю, я писал уже, что я не использую понятие "ассоциативный массив" вообще, когда говорю о JS, я говорю "объект". Но всегда готов найти (и показать - кому это интересно) сходство с этой теоретической структурой. Только лишь абстрактно: все JS объекты - есть нечто, что может хранить ассоциации (по событию (ключу, полю, слоту, свойству и т.д.) "А" выдавать событие (значение) "B"). И если этот ассоциативный объект динамически изменяем - нет возможности утверждать, что это не может подпадать под любые определения, которые также реализуют это поведение (напоминает Duck Typing =)). С другой стороны - если идет разговор о JS, то, естественно, нужно использовать терминологию JS. Просто я, когда слышу от кого-то "ассоциативный массив", поправляю (но не категорично отрубаю, что нет в JS этого), что "в JS терминология (и, что более важно, - идеология) другая, здесь все является объектом, но в целом это напоминает то, что вы видели под терминологией хэш или ассоциативный массив в других реализациях; и если вы хотите изучать именно js, то, когда будете говорить о js - стоит говорить в его терминологии. К тому же, это и физически может отличаться". И все - человек сразу врубается и уже не устраивает холиворы (ну а как же - он видел "то же самое" в других языках и там это называлось так, а тут ему утверждают обратное :))

Zeroglif 27.12.2008 13:19

В таком философском ракурсе можно считать, что все объекты - это "некая абстрактная штуковина", это тоже правильно, только не помогает оценить и понять особенности ;). Ну, какая может быть ассоциация между А и В, если за спиной стоит отряд прототипов? Никакая. Динамическое изменение приводит к изменению длины массива? Может да, а может нет. Есть отличие по синтаксису доступа между массивом vs. объектом? Нет, конечно. Тогда в чём "ассоциативность"? В динамическом изменении в рантайм? В произвольности "ключей"? Это свойства любого объекта. Массивы терминологически выделены из этой общей кучи не за это, а в связи с определённым поведением, не имеющим ничего общего с "ассоциативностью/хешестью"...

Прилагательные массиву не нужны (кроме может специфичных вроде "0-относительный массив", "разреженный массив" и т.п.), они его не очерчивают, не выделяют, его вообще вредно выделять, в крайнем случае можно сказать, что все объекты (все!) в js ассоциативны, только не понятно, что это объясняет, каждый думает о своём. Кто-то начинает видеть два вида массивов, кто-то хеши в своём разумении, кто-то проверяет свойства массива в стиле typeof i == 'number' и так далее...

Dmitry A. Soshnikov 27.12.2008 13:39

Цитата:

Сообщение от Zeroglif
Ну, какая может быть ассоциация между А и В, если за спиной стоит отряд прототипов? Никакая.

А почему нет? - дан ключ, ожидается значение по ключу - как объект найдет это значение, имея ключ (сам ли справится, или кого-то попросит), - дело десятое. Главное, что он вернул ассоциированное значение по ключу. На самом деле, все это отстраненные рассуждения.

Цитата:

Сообщение от Zeroglif
в крайнем случае можно сказать, что все объекты (все!) в js ассоциативны

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

Цитата:

Сообщение от Zeroglif
только не понятно, что это объясняет, каждый думает о своём. Кто-то начинает видеть два вида массивов, кто-то хеши в своём разумении, кто-то проверяет свойства массива в стиле typeof i == 'number' и так далее...

задача, как раз-таки, не запутать этим словом ("ассоциативный"), а сказать, что "то, что вы видели с похожим поведением, здесь похоже, но идеологически отличается, поэтому нужно использовать данную терминологию и понимать данную идеологию, иначе будет полное непонимание, которое и вызвает typeof i == 'number' ".

Zeroglif 27.12.2008 14:03

Цитата:

Сообщение от Dmitry A. Soshnikov
На самом деле, все это отстраненные рассуждения.

Почему отстранённые? Ты пару не задавал, массив/объект "пустой", а она (пара) уже есть, ты пару удалил, а она снова есть (имена совпали), ты её пошёл в прототипе удалил, а она снова есть (снова имена совпали), прочитал из прототипа, положил в объект и т.д. Дело-то не ожидании значения по "ключу", дело в ожидании заданного/правильного значения, дело в мнимой произвольности "ключа", в невозможности быть уверенным в паре, невозможности однозначно удалить пару, в сложности перебора и т.д. Идеология такая не-строгая-делегирующая, ну, сколько пар забито у "пустого" объекта? Их надо все пересмотреть, чтоб определить для себя границы произвольности "ключей", чего задавать, чего не перекрывать? Длина массива ничего не говорит об ассоциациях и т.д. и т.п.

зы Можно поступить проще - взять признанное определение ассоциативного массива (несколько) определений и посмотреть, удовлетворяют ли объекты js этому (этим) определениям. Если определение не будет космически-обобщённо-туманным, то ничего не выйдет. ;)

Dmitry A. Soshnikov 27.12.2008 14:14

Цитата:

Сообщение от Zeroglif
Дело-то не ожидании значения по "ключу", дело в ожидании заданного/правильного значения, дело в мнимой произвольности "ключа", в невозможности быть уверенным в паре, невозможности однозначно удалить пару, в сложности перебора и т.д.

Да, здесь однозначно, определение точной ассоциативности рушится, в том плане что, "удалил, а оно опять тут".

Можно, правда, частный случай задать (ради теорий о точной ассоциативности), но это не меняет факта, что точной ассоциации здесь нет:

obj.get = function(key) {
  if (obj.hasOwnProperty(key)) {
    return obj[key];
  }
  return null;
};


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

Dmitry A. Soshnikov 27.12.2008 14:20

Цитата:

Сообщение от Zeroglif
Можно поступить проще - взять признанное определение ассоциативного массива (несколько) определений и посмотреть, удовлетворяют ли объекты js этому (этим) определениям. Если определение не будет космически-обобщённо-туманным, то ничего не выйдет.

кроме как неточной ассоциации в виду "удалил, а оно опять тут" - удовлетворяет ;) А, если мы не можем однозначно сказать, что стоит за ключом - ассоциация рушится. Ха =) Вот хороший пример, его теперь можно приводить, когда зайдут холиворы, а для недопущения холиворов - сразу сказать (показать), что "здесь похоже, но есть особенности в идеологии, она отличается, мыслите этой идеологией"

Zeroglif 27.12.2008 14:52

Ты всё равно не хочешь идти по простому пути противопоставления мифам таких же лозунгов, может это и не однозначно, зато работает с той же силой, что и миф:

- Ассоциативных массивов нет!
- Классов нет!
- Хешей нет!
- Не всё является объектом!
- eval - зло!
- Ненавязчивого javascript-a в природе не существует!
- ...чего там я ещё забыл...

;)


Часовой пояс GMT +3, время: 17:18.