Итак, скоро заканчивается мое время в качестве ведущего, потому финальная история с философским, надеюсь, финалом :)
Начну с продолжения темы про списки :) Они используются в платформе, хоть это и не всегда очевидно
Например, DOM узлы имеют childNodes. Но дети так же представляют собой двунаправленный список, "связаны" по previousSibling/nextSibling
Не смотря на то, что childNodes ведет похоже на массив, обычно это интерфейс к двусвязному списку + индекс (кеш) по необходимости
Дизайн DOM таков, что браузеру нет нужды обращаться к произвольному ребенку ноды, потому не создаются лишние структуры -> экономия ресурсов
Построение индекса для ноды иницируется только нашим с вами кодом. Он строится при первом обращении к childNodes, путем обхода всего списка
Инвалидация кеша происходит при мутации списка, т.е. добавлении, удалении или перемещении дочернего узла
Потому лучше избегать childNodes для обхода и использовать ссылки, или кешировать его в локальный массив, если при обходе возможна мутация
Так что, даже если единожды делается childNodes[N], то браузер вынужден обойти весь список, построить индекс и только тогда вернуть N-ю ноду
И вот кажется, что можно было бы избежать построение индекса, раз запрашивается лишь одна нода (оптимизация), но обычно это нельзя сделать
Причина в том, что обычно JS и DOM разные компоненты, работают через биндинги, не имеют общих данных и оптимизатора
Сделано так для лучшей модульности. Но может вести к performance bottleneck или утечкам памяти (напр. часть цикла в JS,часть в DOM)
Насколько знаю, пока только в MS решились на объединение JS c DOM, случилось это еще в IE9
blogs.msdn.microsoft.com/ie/2010/09/02/…
blogs.msdn.microsoft.com/ie/2010/08/04/…
Это помогло улучшить IE, но не сильно. Т.к. имплементация DOM старая (20 лет), очень медленная и никогда серьезно не рефакторилась
Но они начали работать над этим, и в некотором будущем появится в Edge blogs.windows.com/msedgedev/2015…
Когда закончат, у нас будет ответ – насколько эффективным может быть DOM и бенефиты от тесной его интеграции с JS
В случае успеха, этот опыт будут перенимать другие браузеры. Так что нас может ждать очередная "гонка вооружений"
Если в результате DOM ускорят в 1,5-3 раза, появится новый класс оптимизаций основанный на структуре DOM и его использования в JS...
... то это может изменить наш подход к решениям. Например, концепции вроде Virtual DOM потеряют смысл в плане ускорения (останется удобство)