2011-04-19 71 views
1

考虑一个名为obj的对象,我认为它等于{x: 1, y: 'hi'}(它在前一段定义,并且在其整个生命周期中通过各种功能进行了一些修改)。Javascript对象不一致

console.log(obj); 
console.log(obj.y); 
console.log(obj.x); 

的这两种铬和FF3.6结果表明的console.log(obj)作为

obj = {x: 1, y: 'hi'} 

如预期的结果。如预期的obj.y的结果打印hi,但obj.x的结果打印0

我不明白这种不一致如何发生。它作为整体对象正确打印,但直接访问该参数后在下一行打印出不同的值。

我认为这与共享对象结构有关,因为我定义了obj并将其存储在数组arr中。然后我使用jQuery的.data()函数将obj放在DOM元素上。我稍后使用DOM元素中的.data()检索对象,并再次修改对象(具体参数为x)。当我稍后访问arr的对象时,我正在看到的古怪事情正在发生。

主要是,我只是想知道为什么的console.log显示不一致

+2

没有一些现场演示是不可能分辨的。如果我创建一个这样的对象,'obj.x'会打印'1'。即我无法重现错误...请提供问题的演示。 – 2011-04-19 18:39:39

+0

我不认为我有足够的信息知道哪里出了问题。从您描述的内容中,当您使用.data()访问它或从数组中检索它时,应该引用同一对象。你对obj.x的操作究竟是什么? – 2011-04-19 18:46:07

+0

@Jesse就像obj.x = 2或其他东西 – 2011-04-19 18:48:52

回答

0

当您从“数据()”取一个对象,你获得对象的副本 - 你对象本身。只有一个。因此,如果你这样做:

$('#foo').data('obj', { x: 1, y: "hi" }); 

然后:

var obj = $('#foo').data('obj'); 
// ... 
if (whatever) obj.x = 0; 

再后来,当您通过 “数据()” 引用 “目标文件” 再次将 “X” 属性将为零(如果在这种情况下“if”条件成立)。

如果你想是当然的副本,你可以通过自己复制数据来避免这种情况。

+0

当然可以,但是关于为什么console.log显示两个不同的结果的基础上,我告诉它打印的任何想法? – 2011-04-19 18:48:25

+0

我不能重复那个经历,所以你必须做一些你没有描述过的事情。当我完全按照您的建议进行操作时,我会得到Chrome预期的答案(也就是说,“x”在两个格式中都是1)。 – Pointy 2011-04-19 18:55:43