2012-03-12 29 views
1

我很难理解Javascript的行为。JSON损坏的属性

代码:

function getPosition(element){ 
    var position = { 
     x:$(".line div").has(element).index(), 
     y:$(".line").has(element).index() 
    }; 
    console.log(position.y); 
    console.log(position) 
    return position; 
} 

现在,同时从函数调用它我得到的结果是这样的:

0 

Object 
x: 8 
y: 3 

我不明白是怎么回事可能改变对象的属性时试图通过对象引用来访问它,但不是直接访问它。

但是当我打电话同样的功能从控制台我得到这个:

0 

Object 
x: 8 
y: 0 

这是传递给函数相同的元素。而且它似乎总是在X或Y为0(零)时失败,当它是另一个数字的时候就没问题。

任何人都可以解释我做错了什么吗?或者它是一些JS错误? O_o

编辑:

所以我终于找出问题所在。我一直认为自己是在传递价值观,但不幸的是我总是错了。在一些关于stackoverflow的搜索过程中,我发现关于JS值和引用的topic

如果任何人有兴趣,懒得看这个话题,你可以看看这个例子。这几乎是自我解释。

function test(){ 
    var a = 5; 
    var b = a; //b now has value of 5 
    console.log("a:"+a+":b:"+b); 
    b = 4;//a still has value of 5 and b is assinged to 4 
    console.log("a:"+a+":b:"+b); 
    var c = {val:1}; 
    var d = c; //d now has reference to c 
    d.val = 2; //c.val changes because it is a reference 
    console.log(c); 
} 

EDIT2: 噢,对了,我怎么能记住我的问题,因为回答?

回答

0

所以我终于找出问题所在。我一直认为自己是在传递价值观,但不幸的是我总是错了。在一些关于stackoverflow的搜索过程中,我发现了关于JS值和引用的主题。

如果任何人有兴趣,懒得看这个话题,你可以看看这个例子。这几乎是自我解释。

function test(){ 
    var a = 5; 
    var b = a; //b now has value of 5 
    console.log("a:"+a+":b:"+b); 
    b = 4;//a still has value of 5 and b is assinged to 4 
    console.log("a:"+a+":b:"+b); 
    var c = {val:1}; 
    var d = c; //d now has reference to c 
    d.val = 2; //c.val changes because it is a reference 
    console.log(c); 
} 
3

console.log延迟将值转换为字符串,直到应用程序变慢,以便日志记录不会不必要地减慢应用程序。

如果console.log(position)被示出的值是不同于在时间console.log被称为其因为position已经在呼叫和时间控制台插件决定格式化用于显示的值之间改变。

您可以尝试以下HTML看到这一点:

<script> 
// Emits the JSON form when converted to a string. 
var obj = { 
    x: 1, 
    toString: function() { 
    return JSON.stringify(this); 
    } 
}; 

console.log(obj); // Often {x:2} 
console.log("" + obj); // Reliably {x:1} 

obj.x = 2; 
</script> 

查找代码,不会像

obj = getPosition(...); 
... 
obj.y = <expression that evaluates to zero> 

或者,您也可以通过更改

console.log(position) 
强行渴望格式

console.log("" + position) 
+0

好吧,现在我知道为什么可以看到两个不同的值,但我无法找到我在我的代码中做错了什么。我甚至改变了名字,以便它不会重叠或者什么。我如何知道问题在哪里? – 2012-03-12 20:15:35

+0

@VytautusButkus,如果你使用Firefox,你可以使用['Object.watch'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch)来安装属性断点obj的'y'属性,所以你可以在代码修改时转储'console.trace()'或'throw'。 – 2012-03-12 20:42:17

+0

奇怪的行为,如果我设置对象的手表,它会得到正确的值,但只要我注释它就会回到错误的值。任何其他提示? – 2012-03-12 22:13:31