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

x-yuri 06.01.2009 07:44

хорошо, я хочу создать диалоговое окно с помощью jquery.dialog. Для этого мне нужно передать в качестве первого и единственного параметра набор опций, у каждой есть имя и значение, т.е. набор пар ключ-значение, т.е. ассоциативный массив. Для этого мне нужно знать названия опций и какие значения они могут принимать. К чему мне здесь прототипы и то, что в качестве ключа можно использовать функцию? Зачем мне лишние детали?

Андрей Параничев 06.01.2009 14:39

В качестве ключа использовать функцию? Это как?

x-yuri 06.01.2009 19:33

функция - тип данных? в строку преобразовать можно? Вот вам и ключ
Цитата:

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

x-yuri 06.01.2009 19:34

т.е. дело не в том, что в строку преобразовать можно, а в том, что "ключом в хеше может быть все, что угодно"

Kolyaj 06.01.2009 19:40

x-yuri,
разные функции могут давать одинаковый хеш.

x-yuri 06.01.2009 19:55

замечательно, меня это не интересует, не представляю задачи, в которой это может понадобится

это Dmitry A. Soshnikov про функции в качестве ключей упомянул, так что все такие вопросы - к нему

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

Dmitry A. Soshnikov 06.01.2009 23:21

Цитата:

Сообщение от x-yuri
это Dmitry A. Soshnikov про функции в качестве ключей упомянул

Нет, об этом я не говорил. Я говорил про то, что ключ может содержать функцию в качестве значения. И это было сказано на следующее предположение:

Цитата:

Сообщение от x-yuri
Если же переменная обладает поведением - то это объект

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

Цитата:

Сообщение от x-yuri
т.е. дело не в том, что в строку преобразовать можно, а в том, что "ключом в хеше может быть все, что угодно"

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

Цитата:

Сообщение от x-yuri
замечательно, меня это не интересует, не представляю задачи, в которой это может понадобится

Да, прикладных задач эта дискуссия вряд ли коснется ;) здесь больше теоретический уклон.

Цитата:

Сообщение от x-yuri
т.е. речь о том, стоит ли строго придерживаться терминологии или стоит избегать лишних деталей (краткость сестра таланта) ;-)

Терминологии, несомненно, придерживаться стоит, причем, это и поможет избежать лишних деталей.

Чтобы подытожить, небольшая памятка по терминологии и основным принципам:

1. в JS есть объекты и примитивы;

2. примитивы при выполнении специфических операций преобразуются в
объекты;

3. исходя из 2) можно образно говорить, что "все в JS - объекты", однако, помнить, первые два пункта и знать, что пункт 3) - образный.

4. любой объект-контейнер может быть назван ассоциативным, поскольку может содержать пары "ключ => значение"

5. помнить, что ввиду делегирующей прототипной модели - ассоциация не точная, поэтому пункты 4 и 5 вообще употреблять не нужно :) (Хотя, тогда и в Питоне надо идти спрашивать, почему dict обособили от остальных объектов; там, как уже было показано, та же неоднозначность).

6. объекты, конкретно порожденные от конструкций Object, new __конструктор__ и {} (где __конструктор__ - объект-функция) принято (и согласно терминологии ECMA) называть объектами

7. объекты, порожденные от конструкций Array и [] принято (и согласно терминологии ECMA) называть массивами

8. объекты, порожденные от конструкций function и Function принято (и согласно терминологии ECMA) называть функциями или методами

10. согласно пункту 3), пункты 6), 7) и 8) можно называть объектами; это тоже будет верно, но уже будет более теоретический уклон, поскольку, обычно, в соответствующих местах, употребляются понятия из 6), 7) и 8)

11. если разговор не теоретический, а прикладной, никто не съест, если {} будет назван "ассоциативным массивом" / "хэшем" (или еще чем-то, услышанным в альтернативной технологии). Главное, опять, помнить и знать, - с таким успехом, все объекты являются "ассоциативными" и идеология в JS иная. Поэтому, чтобы "избежать лишних деталей", - лучше использовать лаконичную терминологию JS.

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

x-yuri 06.01.2009 23:36

Цитата:

Терминологии, несомненно, придерживаться стоит, причем, это и поможет избежать лишних деталей.
Так и я вас спрашиваю, зачем мне нужно знать, что я работаю с объектом, если я не использую все его возможности? Они мне сейчас не нужны. Если у меня просто набор пар ключ-значение. А терминология Javascript добавляет лишние детали.

Dmitry A. Soshnikov 07.01.2009 00:10

Цитата:

Сообщение от x-yuri
зачем мне нужно знать, что я работаю с объектом, если я не использую все его возможности?

А что за специфичные "возможности"? И опять же, понятие объект - тоже образное, и в разных технологиях может иметь отличия (в частности, и в возможностях).

Цитата:

Сообщение от x-yuri
А терминология Javascript добавляет лишние детали.

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

x-yuri 07.01.2009 00:20

Цитата:

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

Цитата:

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

кстати, наткнулся недавно на статью http://www.quirksmode.org/js/associative.html (Objects as associative arrays), известный такой сайт


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