是时候全面了解一下window.console了!

标签: 工具  console


毫不夸张地说,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对象,它包含三个值,分别是

  1. showHidden,是否显示不可枚举属性和符号属性,node控制台默认不显示此类属性。
  2. depth,格式化对象时的递归次数,也就是对象展开深度。在Node控制台中,无法显示折叠按钮和手动展开,只能一次输出,所以需要规定对象的展开次数,默认2次。下图中,深度为3的属性没有接着展开,而是显示为{ name: [Object] }。
    在这里插入图片描述
  3. 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,然后手动将后续样式重置为默认样式:
在这里插入图片描述

总结

浏览器的控制台使用起来并不难,不过还是有很多小技巧相信大多数同学都没使用过,希望读完本文后,可以尝试着用起来,对提高开发效率会有很大帮助。

版权声明:本文为qq_41694291原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41694291/article/details/106585026

智能推荐

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容器结合。...