Javascript 通过jQuery.fn.data()分配变量将保留对原始标记值的引用?
考虑到以下html:Javascript 通过jQuery.fn.data()分配变量将保留对原始标记值的引用?,javascript,jquery,Javascript,Jquery,考虑到以下html: <div id="test" data-test='["foo", "bar"]'></div> 然后我将得到以下结果: dataValue ['bar'] // as expected, i'm fine with that jQuery('#test').data('test') ['bar'] // why ? i would expect ['foo', 'bar'] 对于javascript本身或jQ
<div id="test" data-test='["foo", "bar"]'></div>
然后我将得到以下结果:
dataValue
['bar'] // as expected, i'm fine with that
jQuery('#test').data('test')
['bar'] // why ? i would expect ['foo', 'bar']
对于javascript本身或jQuery,这可能是一些非常基本的问题,但如果有人能对此有所了解,我会很高兴。dataValue.splice(0,1)
将数组更改到位,并且data
仍然有对该数组的引用。它不会创建阵列的副本
这与您执行以下操作的情况相同:
var dataValue = ['foo', 'bar'];
jQuery('#test').data('test', dataValue);
dataValue.splice(0,1);
console.log(jQuery('#test').data('test'));
JavaScript使用引用。这意味着:
[1] !== [1]; // two separate objects
但是:
我更喜欢把它看成巧克力条(:-)。两块巧克力棒永远不一样。如果你吃了一个,另一个还剩下100%。但是如果你只有一块巧克力棒,你吃了它,把那块巧克力棒收起来,过一段时间再拿回来,你就会得到同样的巧克力棒
所以我想说的是,当调用
.splice
时,它正在修改相同的数组。我不知道答案,但是dataValue.concat().splice(0,1)
将为此创建数组或切片的副本
[1] !== [1]; // two separate objects
var arr = [1];
$(elem).data('test', arr)
$(elem).data('test') === arr; // same object again, jQuery respects references