一定听说过 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小时内与您取得联系。