Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Вакансия Javascript-программиста (https://javascript.ru/forum/job/23185-vakansiya-javascript-programmista.html)

trikadin 18.11.2011 17:48

Цитата:

Сообщение от vk65535
Ок, перед тем как я "вон", может скажешь что в этом хэше в качестве ключа?

Извини за грубость, погорячился.

<div id="elem">
 бла-бла-бла,<span>бла-бла,</span> бла-бла, Mr. Freeman.
</div>
<script>
el= document.getElementById("elem");
alert(el.childNodes)// список дочерних узлов
alert(el.childNodes[0])// первый в списке, ключ - число.
</script>


Цитата:

Сообщение от vk65535
Хэши в силу своих свойств не поддерживают порядок следования элементов. Это подсказка к ответу на мой вопрос.

Опять же, сделай ключами цифры и перебирай...

vk65535 18.11.2011 18:13

Уже остыл )
childNodes - не хеш, это коллекция (NodeList), при чем read-only.
Цитата:

Сообщение от w3.org
abstraction of an ordered collection of nodes

В обычном же хэше все ключи должны быть уникальны, каждому ключу может соответствовать только один элемент, и ключи эти не должны меняться по мере добавления/удаления элементов в/из хэша. Если вы вставите дочерний элемент, то у всех последующих элементов индекс в этой коллекции поменяется (увеличится на единицу), в этом она повторяет свойства массива, хотя таковым тоже не является, поскольку содержит ко всему прочему еще и ссылки на элементы по name и id, которые далеко не всегда уникальны, и опять же, в эту коллекцию нельзя делать вставку/удаление.
Физически элементы связанны между собой через nextChild, previousSibling, что и является двунаправленным связанным списком с началом в firstChild и концом в lastChild. А коллекция childNodes обновляется движком по мере вставки/удаления элементов и служит только в качестве вспомогательного механизма для доступа к элементам, но ни в коем случае не для хранения этих элементов.

trikadin 18.11.2011 19:24

Цитата:

Сообщение от vk65535
не хеш, это коллекция

Кхм... Почитайте про коллекции на Википедии (ссылка туда). Коллекция - это просто условное название набора элементов, оно может быть представлено различными типами данных. В случае с childNodes она как раз таки представлена хешем.

Цитата:

Сообщение от vk65535
В обычном же хэше все ключи должны быть уникальны

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

Цитата:

Сообщение от vk65535
Если вы вставите дочерний элемент, то у всех последующих элементов индекс в этой коллекции поменяется (увеличится на единицу)

К свойствам собственно хеша это не имеет никакого отношения. Если у массива это обусловлено способом хранения данных (они хранятся в памяти последовательно), то в случае с childNodes такие действия обусловлены логикой действия программы.

Цитата:

Сообщение от vk65535
и опять же, в эту коллекцию нельзя делать вставку/удаление.

elem.parentNode.removeChild(elem)


Цитата:

Сообщение от vk65535
Физически элементы связанны между собой через nextChild, previousSibling, что и является двунаправленным связанным списком с началом в firstChild и концом в lastChild. А коллекция childNodes обновляется движком по мере вставки/удаления элементов и служит только в качестве вспомогательного механизма для доступа к элементам, но ни в коем случае не для хранения этих элементов.

nextChild и previousChild тоже не хранят элементы. Собственно, суть в том, что элемент - он просто есть. На него может быть сколько угодно ссылок - на элемент это не влияет (ну, почти). Если в C++, скажем, элементы добавляются в двусвязный список, а с удалением массива - исчезают, то здесь можно удалить хоть всех предков элемента - если на него будет ещё хоть одна ссылка, он будет жить. :D

B@rmaley.e><e 18.11.2011 20:04

Цитата:

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

Щито? Разрешение коллизий используется не для ключей, а для их хешей. Коллизии для ключей не рассматриваются в принципе. Считается, что все ключи уникальны, иначе непонятно, как различать элементы с одинаковыми ключами (Хотите хранить их все? Не вопрос — создавайте хеш-таблицу из список).
Никакие списки пользователю хеш-таблицы не возвращаются. Ему возвращается именно элемент, ассоциированный с нужным ключом.

trikadin 18.11.2011 20:11

Цитата:

Сообщение от B@rmaley.e><e
Щито? Разрешение коллизий используется не для ключей, а для их хешей. Коллизии для ключей не рассматриваются в принципе. Считается, что все ключи уникальны, иначе непонятно, как различать элементы с одинаковыми ключами (Хотите хранить их все? Не вопрос — создавайте хеш-таблицу из список).

Рассматриваются. В той же STL под C++ есть реализации ассоциативного массива, которые рассматривают добавление элементов с одинаковыми ключами - сохранение списка этих элементов.

B@rmaley.e><e 18.11.2011 20:53

Цитата:

Сообщение от trikadin
есть реализации ассоциативного массива

Названия в студию.

trikadin 18.11.2011 20:55

multimap и multiset.

vk65535 18.11.2011 21:19

Цитата:

Сообщение от trikadin (Сообщение 137455)
В случае с childNodes она как раз таки представлена хешем.

Вам w3 не авторитет?
Цитата:

Сообщение от Википедия
По реализации

На уровне реализации коллекция может представлять собой одну из следующих структур данных:

* Массив
* Односвязный список
* Двусвязный список
* Стек
* Хеш-таблица
* Битовый массив

Цитата:

Сообщение от trikadin (Сообщение 137455)
elem.parentNode.removeChild(elem)

И где здесь обращение к объекту childNodes? Вы обратились к объекту-хранителю связанного списка.
Цитата:

Сообщение от trikadin (Сообщение 137455)
nextChild и previousChild тоже не хранят элементы. Собственно, суть в том, что элемент - он просто есть. На него может быть сколько угодно ссылок - на элемент это не влияет (ну, почти). Если в C++, скажем, элементы добавляются в двусвязный список, а с удалением массива - исчезают, то здесь можно удалить хоть всех предков элемента - если на него будет ещё хоть одна ссылка, он будет жить. :D

Ну во-первых, все эти механизмы не зависят от языка программирования.
Во-вторых в двусвязных списках ни где не используются массивы - только объекты и указатели, туда-сюда.
В-третьих, я разве писал, что nextChild и previousChild хранят элементы? Они хранят указатели на объекты элементов, как это и делается в любом двунаправленном списке. А коллекция childNodes является уже следствием этого списка, просто как дополнительный словарь-указатель (типа оглавления с закладками на уникальные name и id), и, подозреваю, что нигде во внутренних механизмах браузера не используется ни для рендеринга, ни для x-path обхода дерева. Поднимем исходники какого-нибудь браузера?

trikadin 18.11.2011 21:29

Цитата:

Сообщение от vk65535
Вам w3 не авторитет?

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

Цитата:

Сообщение от vk65535
И где здесь обращение к объекту childNodes? Вы обратились к объекту-хранителю связанного списка.

Это я так... Тут не буду спорить.

Цитата:

Сообщение от vk65535
А коллекция childNodes является уже следствием этого списка, просто как дополнительный словарь-указатель

Это две разных структуры, которые нужны для разных целей. Я изначально спорил о том, что childNodes - это хеш-таблица. То, что перебор детей как двусвязного списка возможен - да, согласен. Сойдёмся на этом?

vk65535 18.11.2011 21:40

Ладно. Кстати, там не обязательно только хэш. Хэш там может быть для хранения значений по name и id, а для числовых индексов массив. Так было бы оптимальнее - чтоб не считать хэш-функции для числовых ключей. Все зависит от реализации.


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