Какая разница между jQuery.data и jQuery._data (подчеркивание данных)?

Пройдя через источник, я заметил, что "toggle" предположительно использует jQuery._data для хранения состояния элемента. Я исследовал объект jQuery.cache в chrome и обнаружил, что у объекта данных элемента был еще один объект под ним, добавленный словом jQuery, с номером, который, как я предполагаю, однозначно идентифицирует его. Однако я не видел данных о состоянии элемента. Просто {olddisplay: 'block'}. Какие-либо подсказки относительно цели jQuery._data и того, как она работает сама по себе?

Я смотрел на источник весь день.... пожалуйста, не говорите мне, чтобы посмотреть источник. Мои глаза и мозг будут вам благодарны.

Ответ 1

jQuery использует _data, чтобы установить флаг 'pvt' для данных, которые он хранит на объекте. pvt используется так, что когда вы запрашиваете общедоступные данные из объекта, данные pvt не возвращаются. Это должно поддерживать внутреннее использование jQuery механизма .data() (например, то, что делает), от использования общественного использования .data().

Вы можете увидеть это объявление в источнике jQuery:

// For internal use only.
_data: function( elem, name, data ) {
    return jQuery.data( elem, name, data, true );
},

Который просто вызывает jQuery.data и заставляет четвертый параметр (который является конфиденциальностью) быть истинным. При извлечении данных, если установлен флаг pvt, он извлекается несколько иначе. Публичные интерфейсы .data() не отображают флаг pvt.

Ниже приведен пример обработки pvt в этой части jQuery.data():

// An object can be passed to jQuery.data instead of a key/value pair; this gets
// shallow copied over onto the existing cache
if ( typeof name === "object" || typeof name === "function" ) {
    if ( pvt ) {
        cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
    } else {
        cache[ id ] = jQuery.extend(cache[ id ], name);
    }
}

а затем в этой же функции этот комментарий довольно описателен:

// Internal jQuery data is stored in a separate object inside the object data
// cache in order to avoid key collisions between internal data and user-defined
// data
if ( pvt ) {
    if ( !thisCache[ internalKey ] ) {
        thisCache[ internalKey ] = {};
    }
    thisCache = thisCache[ internalKey ];
}