你不知道的 console

233 阅读3分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

console.log 大家都很熟悉很常用了,能够将代码里的相关信息,输出到浏览器开发工具的 console 面板,对代码进行调试和分析。

除了 console.log 以外,还有 console.errconsole.table等等。另外浏览器开发工具的console面板,也有很多不错的使用技巧。

console 相关方法

Chrome浏览器打印一下console,可以看到console除了log,还有很多其它方法。

image.png

在 Firefox 浏览器打印 console,看到方法有些许不同,可见有一些是浏览器自行实现的:

image.png

console.assert

接受多个参数,第一个参数为布尔表达式,后面的参数为多个对象或者多个字符串:

console.assert(assertion, obj1 [, obj2, ..., objN]);
console.assert(assertion, msg [, subst1, ..., substN]);

如果断言为false,则将一个错误消息写入控制台。如果断言是 true,没有任何反应。

例如一个判断数字是否是偶数的断言如下:

image.png

也可以是输出多个对象或者对象字符串:

image.png

console.clear

清空 console 面板。在浏览器运行该方法,可以看到 console面板被清空。

image.png

其它清空 console 面板的方法有,点击左上角的🚫按钮,或者快捷键Ctrl+L

image.png

console.count

用于输出console.count()被调用的次数。该方法接受一个字符串作为label

如果没有传入 label,那该方法输出的次数是其被调用的次数。

function greet() {
  console.count();
  console.count();
}

greet();
greet();
console.count();

输出如下:

default: 1
default: 2
default: 3
default: 4
default: 5

如果传入了label,单独计算各label调用的次数:

function greet() {
  console.count('AAAAA');
  console.count('BBBBB');
}

greet();
greet();
console.count('CCCCC');

输出如下:

AAAAA: 1
BBBBB: 1
AAAAA: 2
BBBBB: 2
CCCCC: 1

console.countReset

用于重置 console.count 的次数:

function greet() {
  console.count('AAAAA');
  console.count('BBBBB');
}

greet();
console.countReset('AAAAA');
greet();

输出如下:

AAAAA: 1
BBBBB: 1
AAAAA: 1
BBBBB: 2

console.dirconsole.dirxml

console.dir以树形样式打印对象属性。多数情况该方法与console.log输出对象的表现相似。

在正则表达式的输出上有明显不同:

let rgx = /foo/
console.log(rgx);
console.dir(rgx);

image.png

关于console.dirconsole.log的具体差异可以查看 stack overflow 上的回答

console.dirxml用于以标签形式打印 HTML 节点,如果无法作为HTML节点打印的,会以对象的形式打印:

console.dirxml(document.body);  // 以 HTML 标签形式打印
console.dir(document.body);  // 以对象形式打印
console.dirxml({a:1}); // 以对象形式打印

image.png

console.groupconsole.groupCollapsedconsole.groupEnd

这几个方法用于给输出内容进行分组,使用如下:

console.group();
console.log('AAAAAA');
console.log('BBBBBB');
console.log('CCCCCC');
console.log('DDDDDD');
console.groupEnd();

image.png

console.groupCollapsedconsole.group 的区别在于日志组默认是展开的还是折叠的:

console.groupCollapsed();
console.log('AAAAAA');
console.log('BBBBBB');
console.log('CCCCCC');
console.log('DDDDDD');
console.groupEnd();

image.png

console.table

将数据以表格的形式展示,这个方法可以更加直观地打印数组。

// 打印一维数组
console.table(["apples", "oranges", "bananas"]);

image.png

// 打印二维数组
var people = [["John", "Smith"], ["Jane", "Doe"], ["Emily", "Jones"]]
console.table(people);

image.png

//打印对象
let obj = {a:{a:1,b:2},b:{a:3,b:4},c:{a:4,b:5}}
console.table(obj)

image.png

可以对相关列进行过滤,如下所示:

console.table(obj, ['b']);

image.png

console.timeconsole.timeEndconsole.timeLog

当我们需要跟踪一个操作、一段代码运行时间时,可以使用console.time 启动一个计时器,用console.timeEnd 终止计时并得到时间,console.timeLog可以查看当前计时器时长:

console.time();
let sum = 0;
console.timeLog();
for(let i = 0; i < 10000000; i++) {
    sum += i;
}
console.timeEnd();

输出如下:

default: 0.001953125 ms
default: 78.697998046875 ms

可以接受一个参数作为 label

console.time('TIME');
let sum = 0;
console.timeLog('TIME');
for(let i = 0; i < 10000000; i++) {
    sum += i;
}
console.timeEnd('TIME');

输出如下:

TIME: 0.001953125 ms
TIME: 78.5849609375 ms

console.trace

输出当前调用栈的信息。

function foo() {
  function bar() {
    console.trace();
  }
  bar();
}

foo();

image.png

console.debugconsole.warnconsole.logconsole.infoconsole.error

这几个方法都类似,不通点在于打印的样式:

console.log('Hello');
console.debug('Hello');
console.warn('Hello');
console.info('Hello');
console.error('Hello');

在 Chrome 表现:

image.png

在 Firefox 表现:

image.png

更多方法及细节可以查阅规范Chrome 文档MDN文档

参考

Console 规范

Chrome 文档

Console——MDN