console in web
一般我们要在控制台输出一些信息的时候,大多数情况都只是使用 console.log
来输出。但是,你知道吗?其实 console
还有很多其他的方法。
log
在控制台打印内容,一般的用法——也是我们常用的用法——就是console.log(info[,info,...])
。
1 | var name = 'c.c.'; |
debug/info
info
是 log
的别名,在某些地方见有人说过 console.info
会在输出的文本前加上一个小三角标示,但我在浏览器控制台实测并没有小三角标示。
debug
也类似 log
,不同的是在分级上 debug
属于调试信息,一般在控制台会被过滤掉,需要在控制台选中 Verbose
来查看。
1 | var text = 'Without a date'; |
warn/error
warn
在控制台输出一条带有 “警告” 图标的消息和一个指向该代码调用的追溯引用信息,文字与背景颜色为黄色。error
在控制台输出一条带有“错误”图标的消息和一个指向该代码调用的追溯引用信息,文字与背景颜色为红色。
warn
, error
除了上面的说明外,还有一个输出级别的区分,我们可以通过不同的条件来过滤,只查看 warn
级别或者 error
级别的输出信息。这在一些具有较多输出日志的情况下,能更快速的找到自己需要的一些信息。
trace
在控制台输出该代码调用的追溯引用信息。
实际项目中,一个函数可能在多个地方有调用,还有多个函数嵌套。
有时候想要知道这个函数在某时刻具体是在哪个函数调用的,就可以通过追溯找到嵌套的调用函数路径。
1 | function fn1() { |
time/timeLog/timeEnd
想知道某段代码的运行时间?你还在用下面这种方式吗?
1 | var start = new Date().getTime(); |
快来试试 console.time/console.timeEnd
组合吧。
console.time(label)
创建一个索引为 label
的计时器,console.timeLog(label)
输出索引为 label
的计时器经历的时间,console.timeEnd(label)
停止索引为 label
的计时器,并输出从创建到停止所耗的时间(毫秒)。常用来查看代码运行的效率性能。
使用
timeLog/timeEnd
时,必须有一个通过time
创建了的定时器。
如果没有创建或 label 参数错误无法找到创建的定时器,会输出一个警告Timer 'default(or input label)' does not exist
1 | console.time('Sum'); |
group/groupEnd/groupCollapsed
group
方法输出一条消息,并打开一个分组的嵌套块,块中的内容都会缩进,调用console.groupEnd()
关闭嵌套块。groupCollapsed
方法与 group
方法一样,唯一的区别是该组的内容,在第一次显示时是收起而非展开的。
通过这个方法,我们可以很清楚的了解到代码的运行顺序。
1 | console.group('group demo'); |
profile/profileEnd
console.profile([title])
打开JavaScript性能测试开关,可选参数title会在打印性能测试报告时在报告的开头输出。这两个 API 尚未标准化
1 | function doTask() { |
table
对于某些复合类型的数据,console.table(object)
方法可以将其转为表格显示。条件是必须拥有主键。
对于数组来说,主键就是数字键;对于对象来说,主键就是它的最外层键。
表格可以用于数据统计,如果要查看一个结构相同或类似的列表时,就可以使用 console.table
。另外 console.table
还可以根据第二个参数,来过滤要展示的属性列表,在 Chrome 浏览器中还能够点击第一行的索引来重新排序。
1 | var arr = [{ |
count/countReset
count
计数器,输出它被调用了多少次,有一个可选参数,会在显示计数时在开头输出,并用于区分不同的计数器。
countReset
重置 count
计数器。
1 | for (var i = 0; i < 10; i++) { |
dir/dirxml
dir
方法用于显示指定对象的属性,并以易于阅读的格式——类似文件树样式的交互列表——显示,该方法对于输出DOM对象非常有用。(在 FireFox 中会直接展开)dirxml
方法主要用于显示一个明确的 XML/HTML 元素的 DOM 节点对象,可以让你看到该节点的所有子节点内容。如果参数不是 DOM 节点,而是普通的JavaScript对象,console.dirxml
等同于 console.dir
。
1 | console.dir(document.getElementById('header')); |
assert
assert
方法主要用于程序运行过程中,进行条件判断,如果不满足条件,就显示一个错误,但不会中断程序的执行。这样就相当于提示用户,内部状态不正确。
它接收两个参数,第一个是表达式,第二个是字符串。只有当第一个参数为false
时,才会提示有错误,在控制台输出第二个参数,否则不会有任何结果。
1 | console.assert(1 > 2, '判断错误'); |
console.assert()
方法在 Node.js 中的实现和浏览器中可用的console.assert()
方法实现是不同的。
在浏览器中当console.assert()
方法接受到一个值为假断言(assertion)的时候,会向控制台输出传入的内容,但是并不会中断代码的执行,而在 Node.js v10.0.0 之前,一个值为假的断言也将会导致一个AssertionError被抛出,使得代码执行被打断。
v10.0.0修复了此差异,所以现在console.assert()在node和浏览器中执行行为相同。
引自: MDN-Console.assert
memory
一个可以查看 JS 堆栈内存使用情况的对象,Chrome 浏览器。
1 | console.momery; |
clear
clear方法用于清除当前控制台的所有输出,将光标回置到第一行。
console 的其他小知识
打印对象
以前遇到过好些人问,用 console.log
去调试的时候,打印一个对象,查看发现某个属性明明是有值的,可是代码运行却是按照无值来运行的。这是怎么回事?
1 | var yakumo = { |
把上面的代码复制,放到浏览器的控制台中运行一遍,你可能会说:我这边输出的是 { name: 'Yukari', age: Infinity }
啊。
但是接下来,点击一下对象左侧的三角,展开对象,你会发现该对象 age
的值成了 17
。
其实 console.log
打印出来的对象并非该对象的当时值(深拷贝),打印出来的其实是对象的一个地址引用。
在展开对象之前以文本形式展示出来的,是对象被打印时刻的状态转成字符串的输出。
当你第一次展开对象时,会获取到最新的对象属性进行查看,之后关闭再展开时,则固定成了第一次的属性了(排除使用 getter 或类似的属性)。
我们都知道代码运行时很快的,所以当你在控制台上看到这个被打印出来的对象时,这个对象内的一些属性也许早已在某些地方被改变了。
格式化占位符
console.log
第一个参数中还支持 printf
的占位符哦,后续参数根据位置对应填入占位符的位置输出。
支持的格式化占位符列表:
占位符 | 意义 |
---|---|
%s | 字符串 |
%d, %i | 整型(暂不支持数字型字符串) |
%f | 浮点型(暂不支持数字型字符串) |
%o, %O | 链接对象 |
%c | CSS格式字符串 |
%s
是字符串的占位符。
1 | console.log('%s placeholder', 'hello'); // => hello placeholder |
%d
、%i
、%f
, 虽然在 JS 中不区分整型与浮点型,只有 Number
。但是在占位符中,%d
与 %i
只会输出整数部分,而 %f
则能输出浮点数。如果对应占位符的参数不是 Number
类型,则会输出 NaN
。
在 Chrome 中的表现:
%d
,%i
,%f
只能作为Number
的占位符,即使是数字型的字符串(e.g. “123”) 也会输出成 NaN
在 FireFox 中可以输出 numeric 的字符串,如果是不能转成数字的字符串,则会输出 0,另%f
固定会输出一个 6 位小数位的浮点数
1 | console.log('1 + 2 = %d', 1 + 2); // => 1 + 2 = 3 |
%o
, %O
都是对象的占位符。
在 FireFox 浏览器中表现相同,在 Chrome 浏览器中的表现则不同。
Chrome 中的不同之处在于:%o
是对象引用,会直接将对象内的属性展示出来,对于 DOM 节点对象则是展示类似 Element 的节点;而 %O
则是折叠起来的对象,在不点击展开的情况下,无法看到对象内的属性,对于 DOM 节点对象也是如此。
1 | // in Chrome |
%c
是 CSS 格式字符串的占位符。可以通过 %c
占位符给输出的文本添加一些样式,比如更大的字号、更醒目的颜色、添加背景色等,使得输出更加醒目。
因为每个浏览器的具体实现不同,更多的 CSS 效果可以自己动手试试看。
每个输出默认是
inline
盒子,且无法使用display
转换成block
。
也因此,width
,height
属性无效,但可以通过line-height
来撑起高度。padding/margin
的top
/bottom
在 FireFox 下没有效果,但left
与right
有效-webkit-background-clip: text;
在 FireFox 中有效,但在 Chrome 中无效
… 还有其他很多属性等你探索
1 | console.log('%cRainbowGirl', 'font-size: 40px; line-height: 60px; padding: 0 10px; color: #fff; background: linear-gradient(90deg, red 0%, orange 15%, yellow 45%, green 60%, cyan 75%, blue 90%, purple 100%)'); |
console 中的 await
我们知道在 ES2017 中新增了 async/await
两个关键字,用于更方便的异步操作。
1 | async function fn() { |
async/await
是成对使用的。await
只能使用在 async
声明的异步函数中。
但是,浏览器中的 console
对象下的方法内其实也可以使用 await
,不过这种用法只能用于直接在控制台中调试时。
如果用在 script 脚本中的话,会报语法错误。
1 | // in browser console |
1 | <!-- in web script --> |