是时候全面了解一下window.console了!
目录
- 一、常用函数
- 1. console.assert(value, [...message])
- 2. console.clear()
- 3. console.count([label])
- 4. console.countReset([label])
- 5. console.debug(data, [...args])
- 6. console.dir(obj)
- 7. console.dirxml(...data)
- 8. console.error(data, [...args])
- 9. console.group([...label])
- 10. console.groupCollapsed([label])
- 11. console.groupEnd()
- 12. console.info(data, [...args])
- 13. console.log(data, [...args])
- 14. console.table(tabularData[, properties])
- 15. console.time([label])
- 16. console.timeEnd([label])
- 17. console.timeLog(label)
- 18. console.trace([message],[...args])
- 19. console.warn(data, [...args])
- 二、用法说明
- 总结
毫不夸张地说,window.console算是前端最重要的调试工具之一。
一般来说,一段程序只需要输出几个重要变量,整个的执行过程就可以一目了然。浏览器为我们提供了类似下面的界面来输出这些内容:

window.console提供了很多的方法对输出结果进行格式化,不过最常用的大概就是console.log(没办法,它太过强大)了。不过console的秘密可远不止这些:
一、常用函数
1. console.assert(value, […message])
断言函数。
assert是很多测试框架最常用的断言函数,目的是验证第一个参数value是否为真。如果是,则不输出任何内容,否则就抛出一个Assertion failed异常,表示断言失败,并输出后续参数。
value除了可以是一个变量,更常见的是一个表达式,或一个真值函数的返回值。如:
console.assert(true, '断言失败'); // 第一个参数值为true,没有输出
console.assert({}, '断言失败'); // {}转化为布尔值也是true,断言成功,没有输出
console.assert(1 === '1', '数值1和字符串1不等');
> Assertion failed: 数值1和字符串1不等
console.assert(equal(a, b), 'a和b不相等');
> 如果函数返回true,则不输出内容,否则将抛出异常
console.assert([] == [], '断言失败', '[]和[]不相等')
> Assertion failed: 断言失败 []和[]不相等
2. console.clear()
清空控制台,并显示Console was cleared。
3. console.count([label])
用于在控制台维护一个计数器。
count可以接受一个参数作为计数器的标签,如果不传,则默认是default。每次调用console.count,标签对应的计数器就会加1:
> console.count()
default: 1
> console.count('default')
default: 2
> console.count('abc')
abc: 1
> console.count('xyz')
xyz: 1
> console.count('abc')
abc: 2
> console.count()
default: 3
4. console.countReset([label])
重置计数器。
调用该方法可以使计数器的值失效,并在下次调用count时重新从1开始计数:
> console.count('abc');
abc: 1
> console.countReset('abc');
> console.count('abc');
abc: 1
countReset函数本身并没有输出。
5. console.debug(data, […args])
据MDN文档介绍,该方法应该与console.log类似,但是在Chrome控制台调用时发现该函数总是返回undefined,因此建议不要使用该方法。
6. console.dir(obj)
以一种可折叠的方式显示一个对象:


不过其实使用console.log输出对象时的格式也大同小异:

两者的差异主要在于console.dir可以显示数据类型,而console.log不显示。
Node环境下,该方法与浏览器控制台存在很大差异。此时它还可以传入一个options对象,它包含三个值,分别是
- showHidden,是否显示不可枚举属性和符号属性,node控制台默认不显示此类属性。
- depth,格式化对象时的递归次数,也就是对象展开深度。在Node控制台中,无法显示折叠按钮和手动展开,只能一次输出,所以需要规定对象的展开次数,默认2次。下图中,深度为3的属性没有接着展开,而是显示为{ name: [Object] }。

- colors,是否对输出结果着色,默认不着色。着色规则可定制,默认效果大致如下:

注意,options在浏览器控制台下是无效的。
7. console.dirxml(…data)
如果传入的是一个xml/html对象,会以对应的格式打印它,否则将按照普通javascript对象的格式打印到控制台。
8. console.error(data, […args])
输出一条错误提示。
它的第一个参数是要输出的提示信息,后续的参数可以作为它的格式化数据使用,如:

%s是一个字符串占位符,它会被替换为后续对应的参数inputValue,这种输出方式类似于c语言中常用的printf函数。
9. console.group([…label])
定义一个输出组,输出组内的输出都会默认进行缩进,如:

该函数非常适用于输出一组相关数据。
console.groupEnd()用于结束一个输出组,处在group函数和groupEnd函数之间的,都是该输出组的内容。console.group可以接受一个字符串作为标签,从截图中可以看到,默认的组名是console.group。另外,输出组可以嵌套,内部的输出组将会进一步缩进:

10. console.groupCollapsed([label])
功能与group类似,不过它定义的输出组默认是收起的,如:

11. console.groupEnd()
结束一个输出组,用法见上述截图。
12. console.info(data, […args])
现在console.info是console.log的别名,两者的输出没有差别。
13. console.log(data, […args])
向控制台输出若干个参数。允许使用格式化语法:
console.log("参数值:%s", 'carter');
> 参数值:carter
14. console.table(tabularData[, properties])
用table的方式输出一个数组或对象。比如我们现在有下面这样一个数组:
let user = [{name: "张三", age: 21},{name: "李四", age: 22},{name: "王二", age: 21},{name: "张三丰", age: 212}]
如果直接用console.log输出,未免看起来不太直观,我们就可以用console.table以表格的形式输出:
console.table(user);
结果如下:

控制台里绘制表格,就是这么容易!
函数的第二个参数用来规定表格中应该呈现哪些列,比如我们现在只需要显示name,不显示age,可以这样写:console.table(user, ['name']);

15. console.time([label])
启动一个控制台计时器。
我们之前可能一般这样来测算时间:
let startTime = (new Date()).getTime()
...
let endTime = (new Date()).getTime()
console.log(endTime - startTime);
但其实可以通过这样的代码实现:
console.time();
...
console.timeEnd();
对于精确计时,第二种方法的优势是巨大的,因为在以毫秒为单位的情况下,第一种只能精确到整数位,第二种则可以精确到小数点后十位:

如果你想比较1000次空循环和10000次空循环的性能差异,第一种方法会告诉你两者都是0毫秒(因为它只能精确到毫秒,而10000次空循环的耗时远不到1毫秒),而第二种方法会输出一个精度相当高的值。
console.time还可以接收一个字符串作为计时器的标签,用于区分不同的计时器。需要结束计时只需要给console.timeEnd()传入这个label即可。控制台最多可接受10000个计时器同时计时。
16. console.timeEnd([label])
结束计时,用法如上。
17. console.timeLog(label)
打印特定计时器的当前计时时间。
有时我们可能不一定只在计时结束时才需要知道总的计时,而是在计时的某些时间节点连续输出多组值,比如:
console.time('process');
for(var i = 0; i < 100; i++) {
...
console.timeLog('process');
}
console.timeEnd('process');
这样,每次循环完毕都会输出一次计时结果。
18. console.trace([message],[…args])
打印信息及堆栈信息。

可以看到,控制台会像console.error一样输出完整的调用栈,这非常有利于定位。
19. console.warn(data, […args])
输出警告信息,如:

值得一提的是,如图,warn也会输出堆栈信息。
二、用法说明
当向函数传入多个值时,一般来说控制台会直接将它们以字符串的方式拼接并输出:
var car = "Dodge Charger";
var someObject = { str: "Some text", id: 5 };
console.log("My first car was a", car, ". The object is:", someObject);
> My first car was a Dodge Charger . The object is: ({str:"Some text", id:5})
但是当参数中含有格式化字符串时,它后面的参数将依次替换到对应的占位符中:

控制台支持以下4种格式化数据:
| 占位符 | 含义 |
|---|---|
| %o 或 %O | 对象类型。两者的差别为,%O会附带输出对象类型(类似console.dir),%o则不会 |
| %d 或 %i | 数值类型。可以使用类似%.2d进行精确格式化,但Chrome不支持精确格式化 |
| %s | 字符串 |
| %f | 浮点类型。同样的,在非Chrome浏览器中可以进行精确格式化 |
另外,控制台还允许对输出定义样式,该功能使用%c作为占位符,如:

可以看到,%c后续的所有字符串都会被应用后续定义的样式。如果你只希望对字符串中间的一部分子串应用样式可能会稍显复杂,你需要在子串结尾处再插入一个%c,然后手动将后续样式重置为默认样式:

总结
浏览器的控制台使用起来并不难,不过还是有很多小技巧相信大多数同学都没使用过,希望读完本文后,可以尝试着用起来,对提高开发效率会有很大帮助。
智能推荐
AndroidX了解一下
1.说明 官方原文如下: We hope the division between android.* and androidx.* makes it more obvious which APIs are bundled with the platform, and which are static libraries for app developers that work across di...
Hive了解一下
本文分为5部分: Hive产生背景&Hive是什么? 为什么使用Hive&Hive发展历程 Hive体系架构及部署架构 Hive环境搭建 Hive基本使用 1. Hive产生背景&Hive是什么? MapReduce编程的不便性: 前面的博文我们介绍了Map Reduce的使用。我们首先要申明一个Map和一个Reduce才能处理作业。代码量大,复杂。而且需要部署jar执行。...
hashmap了解一下
工作一到五年的程序员出去面试,大部分人都会被问到hashmap源码,因为hashmap是一个非常经典的数据结构,所以很有必要研究一下hashmap在jdk1.8中的源码。 首先谈一下hashmap的数据结构 hashmap底层使用数组加链表的数据结构,每一个数组空间都会存储一个链表结构,每个链表节点都是一个node对象,里面包含存储的hash,ke...
ClassLoader ,了解一下
ClassLoader 类图: Android中ClassLoader的介绍 ClassLoader 介绍: ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能。包括类加载,验证,卸载等 构造方法: BootClassLoader 介绍: 父类构造器 BootClassLoader是ClassLoader的内部类,是单例类,包内可见,我们没法调用,也不能使用它来动态加载...
多态了解一下
多态 1.概念: 按其字面意思为“同一事物具有多种形态”,可以这样理解:向不同的对象发送同一个消息,不同的对象接收消息后会产生不同的行为(即调用不同的函数),也就是说,每个对象可以用自己的方式去相应共同的消息。 多态性是面向对象程序设计的基本特征,若一个类不支持多态,只能说明它是基于对象的,而不是面向对象的,c++中的多态体现在编译和运行两个方面,分别对应静态多态和动态多态...
猜你喜欢
【大数据开发】JDBC编程——使用druid、dbutils工具类、MVC设计模式简单对银行账号转账业务进行优化day28
使用的数据库是前一天的,前面有脚本。这里只是实现了控制层的分层和模型层的分层,视图层简单模拟。 一、项目结构 二、封装工具类 (1)util\DBUtilDruid.java 三、account对象 (1)pojo\account.java 这里写的是JavaBeen 四、对数据库的操作 (1)dao\AccountDao.java 写根据账号查询用户和修改账户余额两个方法接口 (2)dao\im...
Python定时爬取某网页内容
前言 昨天小伙伴说他最近在投资一个类似比特币的叫ETH币(以太币),他想定时获取某网站以太币的“购买价格最低”和“出售价格最低”,他自己没学过Python,也找到一个定时获取股票的例子(没看懂),看我平时有在玩Python,就问我能不能做到;平时我对Python挺感兴趣的,就想试试看。 思路 定时任务 主程序 爬取网页 解析网页 获取所要内容 存入表...
剑指Offer之重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例: 题解: 经验总结:二叉树的问题一般都是分治思想,递归去做。因为二叉树本身就是递归定义的。 解题思路: 前序遍历的第 1 个结点一定是二叉树的根结点; 在中序遍历中,根结点把中序遍历序列分成了两个部分,左边部分构成了二叉树的根结点的左子树,右边部分构...
zuul网关 路由url与service-id配置
在zuul中有两种路由配置: 1. 通过访问ip及端口号映射 2.通过服务名称映射 在上节代码基础上: 首先我把服务提供者与服务消费者都开了集群: 先配置第一种: 更改网关application.yml 通过path和url映射,访问path路径,直接访问到url对应的地址,这样显然不好,因为必须知道为服务的地址,并且集群的数量可能是动态扩展的,只实现了代理转发,不能实...
springMVC原理总结
一.大体流程: ①启动web容器(tomcat,也叫servlet容器) ②WebApplicationContext的servlet和Web容器监听器 配置:在web.xml中配置如下: 默认加载配置文件为:/WEB-INF/applicationContext.xml 最终结果:创建spring的IoC容器(默认WebApplicationContext)(根root上下文)与web容器结合。...
