你真的了解 console 吗

  对于前端开发者来说,在开发过程中需要监控某些表达式或变量的值的时候,用 debugger 会显得过于笨重,取而代之则是会将值输出到控制台上方便调试。最常用的语句就是console.log(expression)了。

然而对于作为一个全局对象的console对象来说,大多数人了解得还并不全面,当然我也是,经过我的一番学习,现在对于这个能玩转控制台的 JS 对象有了一定的认识,想与大家分享一下。

console 对象除了console.log()这一最常被开发者使用的方法之外,还有很多其他的方法。灵活运用这些方法,可以给开发过程增添许多便利。

console 的方法

console.assert(expression, object[, object...])

接收至少两个参数,第一个参数的值或返回值为false的时候,将会在控制台上输出后续参数的值。例如:

console.assert(1 == 1, object); // 无输出,返回 undefined
console.assert(1 == 2, object); // 输出 object

console.count([label])

输出执行到该行的次数,可选参数 label 可以输出在次数之前,例如:

(function() {
  for (var i = 0; i < 5; i++) {
    console.count(‘count‘);
  }
})();
// count: 1
// count: 2
// count: 3
// count: 4
// count: 5

console.dir(object)

将传入对象的属性,包括子对象的属性以列表形式输出,例如:

var obj = {
  name: ‘classicemi‘,
  college: ‘HUST‘,
  major: ‘ei‘
};
console.dir(obj);

输出:

console.error(object[, object...])

用于输出错误信息,用法和常见的console.log一样,不同点在于输出内容会标记为错误的样式,便于分辨。输出结果:

console.group

这是个有趣的方法,它能够让控制台输出的语句产生不同的层级嵌套关系,每一个console.group()会增加一层嵌套,相反要减少一层嵌套可以使用console.groupEnd()方法。语言表述比较无力,看代码:

console.log(‘这是第一层‘);
console.group();
console.log(‘这是第二层‘);
console.log(‘依然第二层‘);
console.group();
console.log(‘第三层了‘);
console.groupEnd();
console.log(‘回到第二层‘);
console.groupEnd();
console.log(‘回到第一层‘);

输出结果:

console.group()相似的方法是console.groupCollapsed()作用相同,不同点是嵌套的输出内容是折叠状态,在有大段内容输出的时候使用这个方法可以使输出版面不至于太长。。。吧

console.info(object[, object...])

此方法与之前说到的console.error一样,用于输出信息,没有什么特别之处。

console.info(‘info‘); // 输出 info

console.table()

可将传入的对象,或数组以表格形式输出,相比传统树形输出,这种输出方案更适合内部元素排列整齐的对象或数组,不然可能会出现很多的 undefined。

var obj = {
  foo: {
    name: ‘foo‘,
    age: ‘33‘
  },
  bar: {
    name: ‘bar‘,
    age: ‘45‘
  }
};

var arr = [
  [‘foo‘, ‘33‘],
  [‘bar‘, ‘45‘]
];

console.table(obj);
console.table(arr);

也可以

console.log(object[, object...])

这个不用多说,这个应该是开发者最常用的吧,也不知道是谁规定的。。。

console.log(‘log‘); // 输出 log

console.profile([profileLabel])

这是个挺高大上的东西,可用于性能分析。在 JS 开发中,我们常常要评估段代码或是某个函数的性能。在函数中手动打印时间固然可以,但显得不够灵活而且有误差。借助控制台以及console.profile()方法我们可以很方便地监控运行性能。

例如下面这段代码:

function parent() {
  for (var i = 0; i < 10000; i++) {
    childA()
  }
}

function childA(j) {
  for (var i = 0; i < j; i++) {}
}

console.profile(‘性能分析‘);
parent();
console.profileEnd();

然后我们可以在 Profiles 面板下看到上述代码运行过程中的消耗时间。

页面加载过程的性能优化是前端开发的一个重要部分,使用控制台的 profiles 面板可以监控所有 JS 的运行情况使用方法就像录像机一样,控制台会把运行过程录制下来。如图,工具栏上有录制和停止按钮。

录制结果:

console.time(name)
计时器,可以将成对的console.time()console.timeEnd()之间代码的运行时间输出到控制台上,name参数可作为标签名。

console.time(‘计时器‘);
for (var i = 0; i < 1000; i++) {
  for (var j = 0; j < 1000; j++) {}
}
console.timeEnd(‘计时器‘);

(刚才实际多写了一层循环,结果电脑风扇呜呜转啊,浏览器直接无响应了。。。)

console.trace()

console.trace()用来追踪函数的调用过程。在大型项目尤其是框架开发中,函数的调用轨迹可以十分复杂,console.trace()方法可以将函数的被调用过程清楚地输出到控制台上。

function tracer(a) {
  console.trace();
  return a;
}

function foo(a) {
  return bar(a);
}

function bar(a) {
  return tracer(a);
}

var a = foo(‘tracer‘);

输出:

console.warn(object[, object...])

输出参数的内容,作为警告提示。

console.warn(‘warn‘); // 输出 warn

占位符

console对象上的五个直接输出方法,console.log(),console.warn(),console.error(),console.exception()(等同于console.error())和console.info(),都可以使用占位符。支持的占位符有四种,分别是字符(%s)、整数(%d 或%i)、浮点数(%f)和对象(%o)。

console.log(‘%s是%d年%d月%d日‘, ‘今天‘, 2014, 4, 15);
console.log(‘圆周率是%f‘, 3.14159);

var obj = {
  name: ‘classicemi‘
}
console.log(‘%o‘, obj);

还有一种特殊的标示符%c,对输出的文字可以附加特殊的样式,当进行大型项目开发的时候,代码中可能有很多其他开发者添加的控制台语句。开发者对自己的输出定制特别的样式就可以方便自己在眼花缭乱的输出结果中一眼看到自己需要的内容。想象力丰富的童鞋也可以做出有创意的输出信息,比如常见的招聘信息和个人介绍啥的。

输出结果:

console.log(‘%cMy name is classicemi.‘, ‘color: #fff; background: #f40; font-size: 24px;‘);

%c标示符可以用各种 CSS 语句来为输出添加样式,再随便举个栗子,background属性的url()中添加图片路径就可以实现图片的输出了,各位前端童鞋快施展你们的 CSS 神技来把控制台玩坏吧~~

参考文献

  1. https://developer.mozilla.org/en-US/docs/Web/API/console
  2. http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html
  3. http://blog.segmentfault.com/civerzhu/1190000000425386
  4. http://blog.mariusschulz.com/2013/11/13/advanced-javascript-debugging-with-consoletable

转载自:Segment Fault

时间: 2024-08-27 14:52:10

你真的了解 console 吗的相关文章

你真的了解console吗?

对于前端开发者来说,在开发过程中需要监控某些表达式或变量的值的时候,用 debugger 会显得过于笨重,取而代之则是会将值输出到控制台上方便调试.最常用的语句就是console.log(expression)了. 然而对于作为一个全局对象的console对象来说,大多数人了解得还并不全面,当然我也是,经过我的一番学习,现在对于这个能玩转控制台的 JS 对象有了一定的认识,想与大家分享一下. console 对象除了console.log()这一最常被开发者使用的方法之外,还有很多其他的方法.灵

console那些你不曾知道的玩法

一.console最常见的四种方法: FireFox(58) Chrome(51) 二.打印对象: 平时想输出对象属性时,可以直接打印对象,对Object使用toString方法会得到 [Object Object] 浏览器环境中console自带的两个方法:  ① console.table( obj ):将对象中的键/值以表格形式输出(Node环境不支持) ② console.dir( obj ):将对象中的键/值以列表形式输出(Node环境不支持) Node环境下:使用util模块中的in

The connection to adb is down, and a severe error has occured(Android模拟器端口被占用)

相信不少同学和我一样遇到这个问题,有时候搞的还要重启电脑,那究竟是什么原因导致的呢,很明显,你的端口被占用了,那下面给出终极解决方案 一.首先描述症状,如下图 二.出现问题了,首先确定你的sdk目录是不是真的在Console输出的那个位置,如果是的话.接下来现在就要看看到底是谁占用了端口.打开命令编辑器进入你的sdk下的platform-tools文件夹输入adb start-serevr  恭喜,说明你的端口被占用了 三.接下来需要确定被占用的端口号是多少,输入命令adb nodaemon s

Android:The connection to adb is down, and a severe error has occured(Android模拟器端口被占用)

相信不少同学和我一样遇到这个问题,有时候搞的还要重启电脑,那究竟是什么原因导致的呢,很明显,你的端口被占用了,那下面给出终极解决方案 一.首先描述症状,如下图 二.出现问题了,首先确定你的sdk目录是不是真的在Console输出的那个位置,如果是的话.接下来现在就要看看到底是谁占用了端口.打开命令编辑器进入你的sdk下的platform-tools文件夹输入adb start-serevr  恭喜,说明你的端口被占用了 三.接下来需要确定被占用的端口号是多少,输入命令adb nodaemon s

控制台输出彩色样式

没错,就是这么无聊,给console的文字添加样式.你以为你真的了解console.log吗?不,你只是把它当成了alert的替代品,多的是你不知道的事. 在正常模式下,一般只能向console 控制台输出简单的文字信息.为了让显示友好一点,可以用console.warn()来输出警告信息,也可以用console.error()来输出错误信息. 笔者以前也只是认为console只有这几种样式,无意中发现居然还能自己添加样式,顿时感觉发现了新大陆. 下面是console.log() API的官方文

2014.12.05(解决eclipse的adb打不开)

一.问题如下图所示 The connection to adb is down, and a severe error has occured.You must restart adb and Eclipse.Please ensure that adb is correctly located at 'D:\android-sdks\platform-tools\adb.exe' and can be executed. 二.出现问题了,首先确定你的sdk目录是不是真的在Console输出的那

C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?

1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又难免混淆他们之间的概念和所适用的场合,决定做一个总结系统的描述这三个宝宝 2.值类型比较和引用类型比较 在编程中实际上我们只需要这两种比较,c#中类型也就这两种 (1)值类型的比较:一般我们就是判断两个值类型实例的各自包含的值是否相等 (2)引用类型的比较:由于引用类型在内存中的分布有两部分,一个是

我所了解的Chrome(不看你真的错过了)

Chrome的隐身模式 先来说说隐身模式的启用方法吧 1.键盘快捷:Ctrl + Shift + N. 2.在Windows7下的任务栏处,右击“Chrome”图标,会出一个下拉菜单,点击“新建隐身窗口”. 3.你还可以在一个正在浏览的页面中,通过“右键点击链接”出现下拉菜单,选择“在隐身窗口中打开链接”,直接进入隐身窗口(如下图). 简单一点的说,Chrome的隐身模式的好处就是保持你的隐私.具体表现在在此窗口中查看的网页不会显示在浏览器历史记录或搜索历史记录中,关闭隐身窗口后也不会在计算机上

这个好像、也许、或许、大概、应该、Maybe真的可以算是传说中的Spring.Net了吧

以前写过一篇名叫”这个好像.也许.大概.应该.Maybe真的算是传说中的面向接口编程了吧“的文章,当时好像是在评论里许诺以后会有一篇叫”文章这个好像.也许.大概.应该.Maybe真的算是传说中的Spring.Net吧“.然后,现在在我们节日的时候,大抵可以算是来承兑诺言的吧. 先介绍一下IoC吧.它呢,中文名字是控制反转.英文是Inversion of Control.Spring.Net就是IoC的一个框架.原本的对象是由类来管理的,比如让创建一个此类的实例,我们会new此类.有了IoC我们就