[譯] 如何充分利用 JavaScript 控制檯

磊仔發表於2017-06-26

JavaScript 中最基本的除錯工具之一就是 console.log()console 還附帶了一些其他好用的方法,可以新增到開發人員的除錯工具包中。

你可以使用 console 執行以下任務:

  • 輸出一個計時器來協助進行簡單的基準測試
  • 輸出一個表格來以易讀的格式顯示一個陣列或物件
  • 使用 CSS 將顏色和其他樣式選項應用於輸出

Console 物件

console 物件允許您訪問瀏覽器的控制檯。它允許你輸出有助於除錯程式碼的字串、陣列和物件。consolewindow 物件的屬性,由瀏覽器物件模型(BOM)提供。

我們可以通過這兩種方法之一訪問 console

  1. window.console.log('This works')
  2. console.log('So does this')

第二個選項本質上是對前者的引用,所以我們使用後者以精簡程式碼。

關於 BOM 的快速提示:它沒有設定標準,所以每家瀏覽器都以稍微不同的方式實現。我在 Chrome 和 Firefox 測試了所有示例,但你的輸出可能有所不同,這取決於你使用的瀏覽器。

輸出文字

將文字記錄到控制檯
console 物件最常見的元素是 console.log,對於大多數情況,使用它就可以完成任務。

輸出資訊到控制檯的四種方式:

  1. log
  2. info
  3. warn
  4. error

他們四個工作方式相同。你唯一要做的是給選擇的方法傳遞一個或更多的引數。控制檯會顯示不同的圖示來指示其記錄級別。下面的例子中你可以看到 info 級別的記錄和 warning/error 級別的不同之處。

簡單易讀的輸出

輸出東西太多將變得難以閱讀

你可能注意到了 error 日誌訊息 —— 它比其他訊息更顯眼。它顯示著紅色的背景和堆疊跟蹤,而 infowarn 就不會。但是在 Chrome 中 warn 確實有一個黃色的背景。

視覺上的區分有助於你在控制檯快速瀏覽辨別出錯誤或警告資訊。你應該確保在準備生產的應用中移除它們,除非你打算讓它們來警示其他操作你的程式碼的開發者。

字串替換

這個技術可以使用字串中的佔位符來替換你向方法中傳入的其他引數。

輸入console.log('string %s', 'substitutions')

輸出string substitutions

%s 是逗號後面第二個引數 'substitutions' 的佔位符。任何的字串、整數或陣列都將被轉換成字串並替換 %s。如果你傳入一個物件,它將顯示為 [object Object]

如果你想傳入物件,你需要使用 %o 或者 %O,而不是 %s

console.log('this is an object %o', { obj: { obj2: 'hello' }})

數字

字串替換可以與整數和浮點數一起使用:

  • 整數使用 %i%d,
  • 浮點數使用 %f

輸入console.log('int: %d, floating-point: %f', 1, 1.5)

輸出int: 1, floating-point: 1.500000

可以使用 %.1f 來格式化浮點數,使小數點後僅顯示一位小數。你可以用 %.nf 來顯示小數點後 n 位小數。

如果我們使用上述例子顯示小數點後一位小數來格式化浮點數值,它看起來這樣:

輸入console.log('int: %d, floating-point: %.1f', 1, 1.5)

輸出int: 1, floating-point: 1.5

格式化說明符

  1. %s | 使用字串替換元素
  2. %(d|i)| 使用整數替換元素
  3. %f| 使用浮點數替換元素
  4. %(o|O) | 元素顯示為一個物件
  5. %c | 應用提供的 CSS

字串模板

隨著 ES6 的出現,模板字串是替換或連線的替代品。他們使用反引號(``)來代替引號,變數包裹在 ${} 中:

const a = 'substitutions';

console.log(`bear: ${a}`);

// bear: substitutions複製程式碼

物件在模板字串中顯示為 [object Object],所以你將需要使用 %o%O 替換以看到詳情,或單獨記錄。

比起使用字串連線:console.log('hello' + str + '!');,使用替換或模板可以建立更易讀的程式碼。

美妙的彩色插曲!

現在,是時候來點更有趣而多彩的東西了!

是時候用字串替換讓我們的 console 彈出豐富多彩的顏色了。

我將使用一個模仿 Ajax 的例子,給我們顯示一個請求成功(用綠色)和失敗(用紅色)。這是輸出和程式碼:

成功的小熊和失敗的蝙蝠

const success = [
 'background: green',
 'color: white',
 'display: block',
 'text-align: center'
].join(';');

const failure = [
 'background: red',
 'color: white',
 'display: block',
 'text-align: center'
].join(';');

console.info('%c /dancing/bears was Successful!', success);
console.log({data: {
 name: 'Bob',
 age: 'unknown'
}}); // "mocked" data response

console.error('%c /dancing/bats failed!', failure);
console.log('/dancing/bats Does not exist');複製程式碼

在字串替換中使用 %c 佔位符來應用你的樣式規則。

console.error('%c /dancing/bats failed!', failure);複製程式碼

然後把你的 CSS 元素作為引數,你就能看到應用 CSS 的日誌了。 你也可以給你的字串新增多個 %c

console.log('%cred %cblue %cwhite','color:red;','color:blue;', 'color: white;')複製程式碼

這將按照他們的代表的顏色輸出字元 “red”、“blue” 和 “white”。

控制檯僅僅支援少數 CSS 屬性,建議你試驗一下哪些支援哪些不支援。重申一下,你的輸出結果可能因你的瀏覽器而異。

其他可用的方法

還有幾個其他可用的 console 方法。注意下面有幾項還不是 API 標準,所以可能瀏覽器間互不相容。這個例子使用的是 Firefox 51.0.1。

Assert()

Assert 攜帶兩個引數 —— 如果第一個引數計算為 false,那麼它將顯示第二個引數。

let isTrue = false;

console.assert(isTrue, 'This will display');

isTrue = true;

console.assert(isTrue, 'This will not');複製程式碼

如果斷言為 false,控制檯將輸出內容。它顯示為一個上文提到的 error 級別的日誌,給你顯示一個紅色的錯誤訊息和堆疊跟蹤。

Dir()

dir 方法顯示一個傳入物件的可互動屬性列表。

console.dir(document.body);複製程式碼

Chrome 會顯示不同的層級
最終,dir 僅僅能節省一兩次點選,如果你需要檢查一個 API 響應返回的物件,你可以用它結構化地顯示出來以節約一些時間。

Table()

table 方法用一個表格顯示陣列或物件

console.table(['Javascript', 'PHP', 'Perl', 'C++']);複製程式碼

輸出陣列

陣列的索引或物件的屬性名位於左側的索引欄,值顯示在右側列欄。

const superhero = {
    firstname: 'Peter',
    lastname: 'Parker',
}
console.table(superhero);複製程式碼

輸出物件

Chrome 使用者需要注意: 這是我的同事提醒我的,上述 table 方法的例子在 Chrome 中貌似不能工作。你可以通過將專案放入陣列或物件陣列中來解決此問題。

console.table([['Javascript', 'PHP', 'Perl', 'C++']]);

const superhero = {
    firstname: 'Peter',
    lastname: 'Parker',
}
console.table([superhero]);複製程式碼

Group()

console.group() 由至少三個 console 呼叫組成,它可能是使用時需要打最多字的方法。但它也是最有用的方法之一(特別對使用 Redux Logger 的開發者)。

稍基礎的呼叫看起來是這樣的:

console.group();
console.log('I will output');
console.group();
console.log('more indents')
console.groupEnd();
console.log('ohh look a bear');
console.groupEnd();複製程式碼

這將輸出多個層級,顯示效果因你的顯示器而異。

Firefox 顯示成縮排列表:

Chrome 顯示成物件的風格:

每次呼叫 console.group() 都將開啟一個新的組,如果在一個組內會建立一個新的層級。每次呼叫 console.groupEnd() 都會結束當前組或層級並向上移動一個層級。

我發現 Chrome 的輸出樣式更易讀,因為它看起來像一個可摺疊的物件。

你可以給 group 傳入一個 header 引數,它將被顯示並替代 console.group

console.group('Header');複製程式碼

如果你呼叫 console.groupCollapsed(),你可以從一開始就將這個組顯示為摺疊。據我所知,這個方法可能只有 Chrome 支援。

Time()

time 方法和上文的 group 方法類似,由兩部分組成。

一個用於啟動計時器的方法和一個停止它的方法。

一旦計時器完成,它將以毫秒為單位輸出總執行時間。

啟動計時器使用 console.time('id for timer'),結束計時器使用 console.timeEnd('id for timer')。您可以同時執行多達 10,000 個定時器。

輸出結果可能有點像這樣: timer: 0.57ms

當你需要做一個快速的基準測試時,它非常有用。

結論

我們已經更深入地瞭解了 console 物件以及其中附帶的其他一些方法。當我們需要除錯程式碼時,這些方法是可用的好工具。

仍然有幾種方法我沒有談論,因為他們的 API 依然在變動。具體可以閱讀 MDN Web APIWHATWG 規範

developer.mozilla.org/en/docs/Web…


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃

相關文章