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

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

考虑到以下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本身或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