2010-06-16 16 views
16

一個非常簡單的代碼來說明差異。FireBug的console.log()和console.debug()有什麼區別?

var x = [0, 3, 1, 2]; 
console.debug('debug', x); 
console.log('log', x); 
// above display the same result 
x.splice(1, 2); 
// below display kind of a different result 
console.debug('debug', x); 
console.log('log', x); 

alt text http://sixbytesunder.com/stuff/firebug_console.png

JavaScript的值是完全相同的,但執行console.log()顯示它有點不同於施加splice()方法之前。正因爲如此,我失去了好幾個小時,因爲我認爲拼接行爲很有趣,使我的數組具有多維或什麼。

我只想知道爲什麼這樣工作。有人知道嗎? :)

+0

正如Tim在下面寫道的:「更可能的是'console.log'和'console.debug'在設計上的表現有所不同。如果您好奇,源代碼可用。「您也可以在[Firebug的討論組]上提問(http://groups.google.com/group/firebug)或[提交錯誤報告](http://code.google.com/p/fbug/問題/列表)。 – 2010-06-16 14:08:51

回答

9

如果你看一下文檔,it says

控制檯知道四種不同類型的消息,這將在下文描述 的 [...]

參見更多控制檯API 有關不同的 命令的信息。

console.log該網頁shows一看:

如果對象登錄,他們將 寫不爲靜態文本,但作爲 互動的超鏈接,可以是 點擊檢查對象在 Firebug的HTML,CSS,腳本或DOM 選項卡中。

所以,我認爲splice之前,該陣列是內部還是一個Array(我知道,這一個類的對象),但手術後,你會得到一個總體目標,至少在內部。我知道這是一個弱解釋,但Firebug在控制檯中有更奇怪的行爲。

順便說一句,在ECMAScript specification說沒有什麼用處,但是我們可以在一節閱讀Array.prototype.splice(第15.4.4.12):

splice功能是有意 通用的;它不要求它的 this值是一個Array對象。 因此,它可以轉移到 其他類型的對象用作 方法。 splice函數 是否可以成功應用於主機 對象取決於實現。

+0

無論是否應用於'Array',Array.prototype.splice'總是返回一個'Array'。這在規範中。 – 2010-06-16 13:30:55

+0

@Tim:是的,我知道,我談到了Firefox *內部*表示,這可能與規範規定的不同。 – 2010-06-16 13:37:20

+2

Firebug是用普通的JavaScript和XUL編寫的。雖然在該環境中運行的JavaScript可以訪問運行在頁面中的JavaScript沒有的對象和擴展,但我無法想象它會偏離規範。更可能的是'console.log'和'console.debug'在設計上的表現有所不同。如果您好奇,源代碼可用。 – 2010-06-16 13:54:55

1

在螢火蟲1.6a12我得到

debug [0, 3, 1, 2] blog.php (line 80) 
log [0, 3, 1, 2] 
debug [0, 2]  blog.php (line 85) 
log [0, 2] 

debug()線包括一個鏈接到console.debug()線的源極線。