将https://api.jquery.com/data/应用于一组选定元素时会发生什么?它是在内部循环匹配的集合并在每个元素上存储数据的单独“副本”吗?或者是否有人存储了一个应用于匹配的集合对象的副本?我下面的小测试案例似乎意味着两者都在发生。鉴于我希望的结果是将相同的数据应用于每个元素,我的第一种或第二种方法是从速度/内存/语义/等角度设置数据首选吗?
http://jsfiddle.net/toyh8fty/1/
<p id="id1">1</p>
<p id="id2">2</p>
<p id="id3">3</p>
var v = {
a: 1,
b: 2,
c: 3
};
var p = $('p');
console.log(p);
p.data(v).each(function () {
var $t = $(this);
console.log(this, $t, $t.data());
});
console.log($('#id1').data());
console.log('p.data', p.data());
p.each(function () {
var $t = $(this);
$t.data(v);
console.log(this, $t, $t.data());
});
console.log($('#id1').data());
console.log('p.data', p.data());
答案 0 :(得分:2)
数据附加到每个元素。在内存中,存在由数据组成的副本。您可以通过运行以下来查看副本:
console.log($.cache)
我添加了一些输出,并且还更改了此 modified fiddle 中的值(这引发了它自己的问题),但您应该能够看到数据独立存储在每个匹配的元素上。 p.data()
只是给你一个摘要。
有关.data
存储数据的详细信息,请参阅this answer,其中还指出了source is available的事实。