2012-03-12 41 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