一定聽說過 console.log() ,而且可能一直在使用它。它非常流行,在集成開發環境中鍵入時,Visual Studio Intellicode 等工具通常會在其他控制臺方法之前推薦使用它。
在本文中,我們將探討一些最有用的控制臺方法,以及它們在數據可視化、調試等方面的用途。
當你需要在代碼中以表格形式(如對象數組)顯示一組對象時, console.table() 方法就會派上用場。以汽車列表為例:
const cars=[
{
color: 'red',
age: 4,
maxSpeed: 120,
},
{
color: 'blue',
age: 2,
maxSpeed: 100,
},
{
color: 'yellow',
age: 3,
maxSpeed: 160,
},
];
如何在控制臺中檢查它們? console.log() 是一種典型的方法:
console.log(cars);
在 Chrome 瀏覽器開發者控制臺中,我們可以檢查我們記錄的對象的各種屬性,層次不限。
我們可以在 Node.js 終端中查看屬性,還可以獲得色彩:
這是一種可以接受的方法,但 console.table() 方法提供了一種更優雅的替代方法:
console.table(cars);
console.table() 在 Chrome 瀏覽器控制臺中:
console.table() in Node.js Node.js 中的
顧名思義,它以易于理解的表格形式呈現數據,就像電子表格一樣。它也適用于數組陣列。
const arr=[
[1, 3, 5],
[2, 4, 6],
[10, 20, 30],
];
console.table(arr);
console.assert() 非常適合調試目的,它接收斷言,并在斷言為 false 時向控制臺寫入錯誤信息。但如果是 true ,則不會發生任何事情:
const num=13;
console.assert(num > 10, 'Number must be greater than 10');
console.assert(num > 20, 'Number must be greater than 20');
第一個斷言通過是因為 num 大于 10 ,所以控制臺只顯示第二個斷言:
console.trace() 可以幫助您在調用它的位置輸出當前堆棧跟蹤。例如
function a() {
b();
}
function b() {
c();
}
function c() {
console.trace();
}
a();
error() 可能是第二種最常用的 Console 方法。在 Chrome 瀏覽器控制臺中,它會以獨特的紅色顯示錯誤信息。
console.error('This is an error message.');
console.log('This is a log message.');
不過,在 Node.js 中不會有這種顏色分離:
不過,信息在內部被寫入不同的位置。 console.error() 寫入 stderr 流,而 console.log() 寫入 stdout 流。你可以使用process.stderr和 process.stdout 訪問這些流。這對于將錯誤信息和信息重定向到不同的文件非常有用,就像我們在下面的代碼示例中所做的那樣。
const fs=require('fs');
const errorFs=fs.createWriteStream('./error-log.txt');
process.stderr.write=errorFs.write.bind(errorFs);
const infoFs=fs.createWriteStream('./info-log.txt');
process.stdout.write=infoFs.write.bind(infoFs);
console.error('This is an error message.');
console.log('This is a log message.');
運行此代碼時,傳遞給 error() 和log()的信息將輸出到相應的文件,而不是控制臺。
console.warn() 在 Chrome 瀏覽器控制臺中輸出黃色信息,表示警告。
console.warn('This is a warning message');
在 Node.js 中,信息會像 console.error() 一樣寫入 stderr 流。
console.count() 記錄當前調用 count() 的執行次數。這是另一個有用的調試工具。
function shout(message) {
console.count();
return message.toUpperCase() + '!!!';
}
shout('hey');
shout('hi');
shout('hello');
由于我們沒有指定標簽,因此顯示的標簽是 default 。我們可以通過為 count() 傳遞一個字符串參數來做到這一點
function shout(message) {
console.count(message);
return message.toUpperCase() + '!!!';
}
shout('hey');
shout('hi');
shout('hello');
shout('hi');
shout('hi');
shout('hello');
現在,每條信息都有不同的計數。countReset() 方法將標簽的計數設回零。
function shout(message) {
console.count(message);
return message.toUpperCase() + '!!!';
}
shout('hi');
shout('hello');
shout('hi');
shout('hi');
shout('hello');
console.countReset('hi');
shout('hi');
我們可以同時使用這些方法來測量程序中某一特定操作所需的時間。
const arr=[...Array(10)];
const doubles1=[];
console.time('for of');
let i=0;
for (; i < 1000; i++) {
for (const item of arr);
}
console.timeLog('for of');
for (; i < 1000000; i++) {
for (const item of arr);
}
console.timeEnd('for of');
console.time('forEach');
i=0;
for (; i < 1000; i++) {
arr.forEach(()=> {});
}
console.timeLog('forEach');
for (; i < 1000000; i++) {
arr.forEach(()=> {});
}
console.timeEnd('forEach');
在此,我們將對 for of 和 forEach 循環進行性能比較。 time() 啟動定時器,執行向其傳遞的標簽所指定的操作。 timeLog() 在不停止計時器的情況下記錄當前持續時間,我們用它來顯示迭代一千次后的時間。 timeEnd() 記錄當前持續時間并停止計時器。我們在一百萬次迭代后調用它。
看起來 forEach() 比 for of 快。
console.clear() 通過清除日志來清除控制臺中的雜亂信息。
console.log('A log message.');
console.clear();
console.group() 為其后的控制臺信息添加一級縮進。 console.groupEnd() 會將縮進程度重置為調用前面的 console.group() 之前的縮進程度。
console.log('This is the outer level');
console.group();
console.log('Level 2');
console.group();
console.log('Level 3');
console.warn('More of level 3');
console.groupEnd();
console.log('Back to level 2');
console.groupEnd();
console.log('Back to the outer level');
console.groupCollapsed() 創建了一個類似 console.group() 的組,但該組是折疊的,直到用戶使用旁邊的 "披露 "按鈕將其展開。
console.log('This is the outer level');
console.group();
console.log('Level 2');
console.groupCollapsed();
console.log('Level 3 ');
console.warn('More of level 3');
console.groupEnd();
console.log('Back to level 2');
console.groupEnd();
console.log('Back to the outer level');
console.log() 將 HTMLElement 記錄為 HTML,我們可以在控制臺中瀏覽:
但是, console.dir() 會將其記錄為一個對象,并顯示一個交互式屬性列表:
正如你在本文中所看到的,除了console.log()之外,還有許多控制臺方法。其中一些只是在控制臺 UI 中用顏色和更好的可視化來點綴,而另一些則可以作為調試和性能測試的強大工具。
sole 對象提供對瀏覽器控制臺的接入(如:Firefox 的 Web Console)。不同瀏覽器上它的工作方式是不一樣的,但這里會介紹一些大都會提供的接口特性。
Console對象可以在任何全局對象中訪問,如 Window,WorkerGlobalScope 以及通過屬性工作臺提供的特殊定義。
它被瀏覽器定義為 Window.Console,也可被簡單的 Console 調用。
最常用的方法就是Console.log(),就是在控制臺輸出內容。剛開始學前端的時候看到大家都是用的Console.log(),幾乎沒有見過Console的其他用法,難道Console真的沒有別的用法了?查了一下后發現Console還是非常強大的,至于為什么很少看到有人用可能是因為用過都刪掉了吧。在此記錄一下Console的其他用法。
注意:因為Console 對象提供對瀏覽器控制臺的接入 所以在不同瀏覽器中的支持及表現形式可能不太一樣,但是調試內容只有我們開發者會看,所以保證開發環境能用這些方法就可以了,下面演示全部都為Chrome上面的效果。
不同類別信息的輸出
console.log('文字信息');
console.info('提示信息');
console.warn('警告信息');
console.error('錯誤信息');
使用Console.group()和Console.groupEnd()包裹分組內容。
還可以使用Console.groupCollapsed()來代替Console.group()生成折疊的分組。
console.group('第一個組'); console.log("1-1"); console.log("1-2"); console.log("1-3"); console.groupEnd(); console.group('第二個組'); console.log("2-1"); console.log("2-2"); console.log("2-3"); console.groupEnd();
Console.group()還可以嵌套使用
使用console.table()可以將傳入的對象,或數組以表格形式輸出。適合排列整齊的元素
使用Console.dir()顯示一個對象的所有屬性和方法
在Chrome中Console.dir()和Console.log()效果相同
使用Console.dirxml()顯示一個對象的所有屬性和方法
在Chrome中Console.dirxml()和Console.log()效果相同
百度首頁logo的節點信息
利用console.assert(),可以進行條件輸出。
使用Console.count()輸出內容和被調用的次數
使用Console.trace()來追蹤函數被調用的過程,在復雜項目時調用過程非常多,用這個命令來幫你縷清。
使用Console.time()和Console.timeEnd()包裹需要計時的代碼片段,輸出運行這段代碼的事件。
使用Console.profile()和Console.profile()進行性能分析,查看代碼各部分運行消耗的時間,但是我在Chrome自帶的調試工具中并沒有找到在哪里查看這兩個方法生成的分析報告。應該需要其他的調試工具。
最后再來介紹一下強大的Console.log(),這個方法有很多的用法(其他輸出方法的用法,如error()等,可以參照log()使用)。
一、提示輸出
可以再輸出的對象、變量前加上提示信息,增加辨識度
二、格式化輸出
三、自定義樣式
使用%c為打印內容定義樣式,再輸出信息前加上%c,后面寫上標準的css樣式,就可以為輸出的信息添加樣式了
Console的用法很多,有些再調試過程中非常實用,可以節省很多時間。當然我知道debug還是用斷點調試的方法比較好,但是小問題用“printf大法”也是很好用的。
寫過前端Javascript代碼的同學肯定不會對console對象感到陌生,在調試的過程中我們經常會用console對象在控制臺輸出一些常量或者變量。
但是相信很多人也就只用過console.log()這一個方法,今天我們就一起來看看console對象還有哪些比較有用的方法。由于本篇文章是跟控制臺有關,代碼就直接在控制臺展現而沒有另外用新文件展示。
Javascript
通過console對象的不同方法,可以在控制臺上輸出不同級別的日志信息,它們會采用不同的標志來展示,如下圖所示。
不同級別的日志
在輸出信息時可以通過%占位符來指定對應的值,而不用總是采用拼接字符串的方法。支持的占位符包括以下幾種。
%s - 字符
%d - 整數
%f - 浮點數
%o - 對象
通過以下一個簡單的例子可以看出其用法。
包含占位符
通過group()方法可以以分組的形式展示出信息,類似于列表結構。
打印分組信息
在一些測試框架中,經常會用assert斷言來判斷一個表達式的值是否為真。同樣在console對象中也有assert方法,在斷言為真時并不會輸出任何信息,而在斷言為false時,直接拋出異常。
表達式判斷
上述代碼中前兩條語句判斷結果都為true,所以沒有輸出任何信息,第三條語句判斷結果為false,所以會直接拋出異常。
console對象有個table方法,可以直接將對象類型的數據以表格展示。
表格打印
通過console.trace()方法可以展示出函數調用棧的信息,來查看函數調用過程,一般會選擇將這個方法放在最后執行的函數的方法體中。
函數調用棧信息
由于棧是先進后出機制,所以先執行的方法會在后面輸出,因此上述代碼結果會按照sum, f2, f1的順序輸出。
一般統計一段代碼執行耗時,方法會是通過Date對象獲取毫秒數,然后將兩個毫秒數進行相減。
一般計時方法
在上述代碼中通過endTime和startTime兩個變量的差值來計算出中間執行代碼的耗時,我們可以看出往一個數組中添加100000個字符串耗時為15毫秒。
同樣可以通過console對象的time()和timeEnd()方法來統計代碼段的執行耗時。time()和timeEnd()可以接收一個字符串作為標識,而且兩個方法接收的字符串必須一樣,如果沒有傳入字符串則默認為‘default’字符串。
console對象計時方法
上述代碼執行結果為16毫秒,與之前那個方法產生的結果大致一樣。
通過console.profile()和console.profileEnd()方法,可以展示出代碼中各個函數執行所消耗的時間,可以用來評估代碼性能。
我們使用以下測試代碼來進行說明。
打開chrome瀏覽器的控制臺會有一個Javascript Profile菜單欄,如果默認情況下沒有的話,可以按照以下方法打開。
Javascript Profile
打開這個菜單選項后,我們可以看出每個方法執行消耗的時間。
時間消耗
今天這篇文章主要總結了下console對象的一些有用的方法,大家都掌握了嗎?
*請認真填寫需求信息,我們會在24小時內與您取得聯系。