jQuery.data()是否存储jQuery DOM对象的引用或深层副本?

Car*_*lis 11 javascript jquery

我正在使用jQuery.data()来存储jQuery DOM对象引用:

myObj.data('key', $('#element_id'));
Run Code Online (Sandbox Code Playgroud)

我会经常使用它(通常是相同的DOM对象),所以我不想占用太多内存.jQuery是存储引用,还是存储DOM对象的深层副本?在这种情况下,我认为最好存储元素id而不是元素引用.

Den*_*ret 11

您构建的jQuery对象$('#element_id')包含

  • 对上下文的引用(此处的文档)
  • 选择器
  • 缓存:长度(在您的情况下为0或1)和找到的dom节点的引用
  • 指向原型的指针(以便您可以调用方法)

您在数据(在节点中)存储的是jQuery对象.此对象不包含引用的DOM节点的任何深层副本,因此您不是存储深层副本,而只是存储主要包含字符串和几个指针的小对象.

并且当缓存DOM节点引用时,它比仅具有id更有效(边缘,因为通过id查找节点总是很快,但如果你有一个更复杂的选择器,这将产生不同).

所以,在我看来,你做的很好,效率很高.

  • 非常有趣,但这回答了提出的问题,这是关于`.data()`而不是jQuery对象*本身*. (2认同)

kie*_*ran 7

您可以直接查看源代码,yay代码是开源的:)

data.js的第51和52行有一个有用的评论:

//可以将对象传递给jQuery.data而不是键/值对; 这得到了

//浅被复制到现有缓存上

所以我猜这是一个浅薄的副本!

更新07/14 - 那个链接是head:master所以现在已经完全过时了,这里是我正在谈论的规范链接:在16ba6ff