通过jQuery.fn.data()分配变量将保留对原始标记值的引用?

时间:2011-10-25 17:05:18

标签: javascript jquery

考虑以下html:

<div id="test" data-test='["foo", "bar"]'></div>

以及以下javascript:

var dataValue = jQuery('#test').data('test');
dataValue.splice(0,1);

然后我会得到以下结果:

dataValue
['bar']         // as expected, i'm fine with that


jQuery('#test').data('test')
['bar']         // why ? i would expect ['foo', 'bar']

这可能是一些非常基本的东西,我不了解javascript本身或jQuery,但如果有人可以对此有所了解,我会很高兴。

2 个答案:

答案 0 :(得分:2)

JavaScript使用引用。这意味着:

[1] !== [1]; // two separate objects

但:

var arr = [1];
$(elem).data('test', arr)
$(elem).data('test') === arr; // same object again, jQuery respects references

我更喜欢把它看作巧克力棒(:-))。两个巧克力棒永远不会相同。如果你吃一个,另一个仍然有100%。但是,如果你只有一个巧克力棒,并且你吃了它,把那个酒吧拿走并在一段时间之后取回它,你将获得那个(吃过的)巧克力棒。

所以我想说的是,在调用.splice时,它正在修改那个相同的数组。

答案 1 :(得分:1)

dataValue.splice(0,1)更改数组就地data仍然具有对该数组的引用。它不会创建数组的副本。

就像你这样做:

var dataValue = ['foo', 'bar'];
jQuery('#test').data('test', dataValue);

dataValue.splice(0,1);    
console.log(jQuery('#test').data('test'));