Хранит ли jQuery.data() ссылку или глубокую копию объекта DOM jQuery?

Я использую jQuery.data() для хранения ссылок на объекты JQuery DOM:

myObj.data('key', $('#element_id'));

Я буду использовать это много (часто для тех же объектов DOM), поэтому мне не хотелось бы занимать слишком много памяти. Сохраняет ли jQuery ссылку или хранит глубокую копию объекта DOM? В этом случае я полагаю, что лучше хранить идентификатор элемента вместо ссылки на элемент.

Ответ 1

Объект jQuery, который вы создаете с помощью $('#element_id') содержит

  • ссылка на контекст (здесь документ)
  • селектор
  • cached: длина (0 или 1 в вашем случае) и ссылки найденного dom-узла
  • указатель на прототип (чтобы вы могли вызывать методы)

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

И по мере того как ссылка узла DOM кэшируется, она более эффективна, чем просто идентификатор (незначительно, поскольку поиск узла по id всегда выполняется быстро, но если у вас был более сложный селектор, это могло бы иметь значение).

Так что, по моему мнению, все хорошо и эффективно.

Ответ 2

Вы всегда можете посмотреть источник напрямую, yay для open source:)

Строки 51 и 52 данных.js имеют полезный комментарий:

//Объект может быть передан в jQuery.data вместо пары ключ/значение; это получает

//неглубоко скопировано в существующий кеш

Поэтому я предполагаю, что это мелкая копия!

обновить 07/14 - эта ссылка была главой: теперь мастер полностью устарел, вот каноническая ссылка на то, о чем я говорил: как у 16ba6ff