灵活使用console让js调试更简单的方法步骤


Posted in Javascript onApril 23, 2019

Web开发最常用的高度就是 console.log ,虽然 console.log 占有一席之地,但很多人并没有意识到 console 本身除了基本 log 方法之外还有很多其他方法。 适当使用这些方法可以使调试更容易,更快速,更直观。

console.log()

console.log 中有很多人们意想不到的功能。虽然大多数人使用 console.log(object) 来查看对象,但是你也可以使用 console.log(object, otherObject, string),它会把它们都整齐地记录下来,偶尔也会很方便。

不仅如此,还有另一种格式化的: console.log(msg, values),这很像 C 或 PHP 中的sprintf

console.log('I like %s but I do not like %s.', 'Skittles', 'pus');

会像你预期的那样输出:

> I like Skittles but I do not like pus.

常见的占位符 %o (这是字母o,不是0),它接受对象,%s 接受字符串,%d 表示小数或整数。

灵活使用console让js调试更简单的方法步骤

另一个有趣的是 %c,这可能与你所想不太相同,它实际上是CSS值的占位符。使用%c占位符时,对应的后面的参数必须是CSS语句,用来对输出内容进行CSS渲染。常见的输出方式有两种:文字样式、图片输出

console.log('I am a %cbutton', 'color: white; background-color: orange; padding: 2px 5px; border-radius: 2px');

灵活使用console让js调试更简单的方法步骤

它并不优雅,也不是特别有用。当然,这并不是一个真正的按钮。

灵活使用console让js调试更简单的方法步骤

它有用吗? 恩恩恩。

console.dir()

在大多数情况下,console.dir() 的函数非常类似于 log(),尽管它看起来略有不同。

灵活使用console让js调试更简单的方法步骤

下拉小箭头将显示与上面相同的对象详细信息,这也可以从console.log 版本中看到。当你查看元素的结构时候,你会发现它们之间的差异更大,也更有趣。

let element = document.getElementById('2x-container');

使用 console.log 查看:

灵活使用console让js调试更简单的方法步骤

打开了一些元素,这清楚地显示了 DOM,我们可以在其中导航。但是console.dir(element)给出了更加方便查看 DOM 结构的输出:

这是一种更客观地看待元素的方式。有时候,这可能是您真正想要的,更像是检查元素。

灵活使用console让js调试更简单的方法步骤

console.warn()

可能是最明显的直接替换 log(),你可以以完全相同的方式使用 console.warn()。 唯一真正的区别是输出字的颜色是黄色的。 具体来说,输出处于警告级别而不是信息级别,因此浏览器将稍微区别对待它。 这具有使其在杂乱输出中更明显的效果。

灵活使用console让js调试更简单的方法步骤

不过,还有一个更大的优势,因为输出是警告而不是信息,所以你可以过滤掉所有console.log并仅保留console.warn。 这对于偶尔会在浏览器中输出大量无用废话的应用程序尤其有用。 清除一些无用的信息可以让你更轻松地看到你想要的输出。

console.table()

令人惊讶的是,这并不是更为人所知,但是 console.table() 函数旨在以一种比仅仅转出原始对象数组更整洁的方式显示表格数据。

例如,这里有一个数据列表。

const data = [{
 id: "7cb1-e041b126-f3b8",
 seller: "WAL0412",
 buyer: "WAL3023",
 price: 203450,
 time: 1539688433
},
{
 id: "1d4c-31f8f14b-1571",
 seller: "WAL0452",
 buyer: "WAL3023",
 price: 348299,
 time: 1539688433
},
{
 id: "b12c-b3adf58f-809f",
 seller: "WAL0012",
 buyer: "WAL2025",
 price: 59240,
 time: 1539688433
}];

如果我们使用 console.log 来输出上面的内容,我们会得到一些非常无用的输出:

▶ (3) [{…}, {…}, {…}]

点击这个小箭头可以展开看到对象的内容,但是,它并不是我们想要的“一目了然”。

但是 console.table(data) 的输出要有用得多。

灵活使用console让js调试更简单的方法步骤

第二个可选参数是所需列的列表。显然,所有列都是默认值,但我们也可以这样做:

> console.table(data, ["id", "price"]);

灵活使用console让js调试更简单的方法步骤

这里要注意的是这是乱序的 - 最右边的列标题上的箭头显示了原因。 我点击该列进行排序。 找到列的最大或最小,或者只是对数据进行不同的查看非常方便。 顺便说一句,该功能与仅显示一些列无关,它总是可用的。

console.table() 只能处理最多1000行,因此它可能不适合所有数据集。

console.assert()

assert()log() 是相同的函数,assert()是对输入的表达式进行断言,只有表达式为false时,才输出相应的信息到控制台,示例如下:

var arr = [1, 2, 3];
console.assert(arr.length === 4);

灵活使用console让js调试更简单的方法步骤

有时我们需要更复杂的条件句。例如,我们已经看到了用户 WAL0412 的数据问题,并希望仅显示来自这些数据的事务,这是直观的解决方案。

console.assert(tx.buyer === 'WAL0412', tx);

这看起来不错,但行不通。记住,条件必须为false,断言才会执行,更改如下:

console.assert(tx.buyer !== 'WAL0412', tx);

与其中一些类似,console.assert() 并不总是特别有用。但在特定的情况下,它可能是一个优雅的解决方案。

console.count()

另一个具有特殊用途的计数器,count只是作为一个计数器,或者作为一个命名计数器,可以统计代码被执行的次数。

for(let i = 0; i < 10000; i++) {
 if(i % 2) {
  console.count('odds');
 }
 if(!(i % 5)) {
  console.count('multiplesOfFive');
 }
 if(isPrime(i)) {
  console.count('prime');
 }
}

这不是有用的代码,而且有点抽象。这边也不打算演示 isPrime 函数,假设它是成立的。

执行后我们会得到一个列表:

odds: 1
odds: 2
prime: 1
odds: 3
multiplesOfFive: 1
prime: 2
odds: 4
prime: 3
odds: 5
multiplesOfFive: 2
...

还有一个相关的 console.countReset(),可以使用它重置计数器。

console.trace()

trace() 在简单的数据中很难演示。当您试图在类或库中找出是哪个实际调用者导致了这个问题时,它的优势就显现出来了。

例如,可能有 12 个不同的组件调用一个服务,但是其中一个组件没有正确地设置依赖项。

export default class CupcakeService {
  
 constructor(dataLib) {
  this.dataLib = dataLib;
  if(typeof dataLib !== 'object') {
   console.log(dataLib);
   console.trace();
  }
 }
 ...
}

这里使用 console.log() 仅告诉我们传递数据dataLib是什么 ,而没有具体的传递的路径。不过,console.trace() 会非常清楚地告诉我们问题出在 Dashboard.js,我们可以看到是 new CupcakeService(false) 导致错误。

console.time()

console.time() 是一个用于跟踪操作时间的专用函数,它是跟踪 JavaScript执行时间的好方法。

function slowFunction(number) {
 var functionTimerStart = new Date().getTime();
 // something slow or complex with the numbers. 
 // Factorials, or whatever.
 var functionTime = new Date().getTime() - functionTimerStart;
 console.log(`Function time: ${ functionTime }`);
}
var start = new Date().getTime();

for (i = 0; i < 100000; ++i) {
 slowFunction(i);
}

var time = new Date().getTime() - start;
console.log(`Execution time: ${ time }`);

这是一种老派的做法,我们使用 console.time() 来简化以上代码。

const slowFunction = number => {
 console.time('slowFunction');
 // something slow or complex with the numbers. 
 // Factorials, or whatever.
 console.timeEnd('slowFunction');
}
console.time();

for (i = 0; i < 100000; ++i) {
 slowFunction(i);
}
console.timeEnd();

我们现在不再需要做任何计算或设置临时变量。

console.group()

// this is the global scope
let number = 1;
console.group('OutsideLoop');
console.log(number);
console.group('Loop');
for (let i = 0; i < 5; i++) {
 number = i + number;
 console.log(number);
}
console.groupEnd();
console.log(number);
console.groupEnd();
console.log('All done now');

输出如下:

灵活使用console让js调试更简单的方法步骤

并不是很有用,但是您可以看到其中一些是如何组合的。

class MyClass {
 constructor(dataAccess) {
  console.group('Constructor');
  console.log('Constructor executed');
  console.assert(typeof dataAccess === 'object', 
   'Potentially incorrect dataAccess object');
  this.initializeEvents();
  console.groupEnd();
 }
 initializeEvents() {
  console.group('events');
  console.log('Initialising events');
  console.groupEnd();
 }
}
let myClass = new MyClass(false);

灵活使用console让js调试更简单的方法步骤

这是很多工作和很多调试信息的代码,可能不是那么有用。 但它仍然是一个有趣的想法,这样写使你的日志记录更加清晰。

选择DOM元素

如果熟悉jQuery,就会知道 $(‘.class')$(‘#id') 选择器有多么重要。它们根据与之关联的类或 ID 选择 DOM 元素。

但是当你没有引用 jQuery时,你仍然可以在谷歌开发控制台中进行同样的操作。

$(‘tagName') $(‘.class') $(‘#id') and $(‘.class #id') 等效于document.querySelector(‘ ‘),这将返回 DOM 中与选择器匹配的第一个元素。

可以使用 \$\$(tagName)\$\$(.class), 注意双元符号,根据特定的选择器选择DOM的所有元素。这也将它们放入数组中,你也可以通过指定数组中该元素的位置来从中选择特定的元素。

例如,$$(‘.className') 获取具有类 className 的所有元素,而\$\$(‘.className')[0]\$\$(‘.className')[1]获取到分别是第一个和第二个元素。

灵活使用console让js调试更简单的方法步骤

将浏览器转换为编辑器

你有多少次想知道你是否可以在浏览器中编辑一些文本? 答案是肯定的,你可以将浏览器转换为文本编辑器。 你可以在 DOM 中的任何位置添加文本和从中删除文本。

你不再需要检查元素并编辑HTML。相反,进入开发人员控制台并输入以下内容:

document.body.contentEditable=true

这将使内容可编辑。现在,你几乎可以编辑DOM中的任何内容。

查找与DOM中的元素关联的事件

调试时,需要查找 DOM 中某个元素的事件侦听器感时,谷歌控制台了 getEventListeners使找到这些事件更加容易且直观。

getEventListeners($(‘selector')) 返回一个对象数组,其中包含绑定到该元素的所有事件。你可以展开对象来查看事件:

灵活使用console让js调试更简单的方法步骤

要找到特定事件的侦听器,可以这样做:

getEventListeners($(‘selector')).eventName[0].listener

这将显示与特定事件关联的侦听器。这里 eventName[0] 是一个数组,它列出了特定事件的所有事件。例如:

getEventListeners($(‘firstName')).click[0].listener

将显示与 ID 为 ‘firstName' 的元素的单击事件关联的侦听器。

监控事件

如果希望在执行绑定到 DOM 中特定元素的事件时监视它们,也可以在控制台中这样做。你可以使用不同的命令来监控其中的一些或所有事件:

  • monitorEvents($(‘selector')) 将监视与选择器的元素关联的所有事件,然后在它们被触发时将它们打印到控制台。例如,monitore($(#firstName)) 将打印 ID 为 firstName元素的所有事件。
  • monitorEvents($(‘selector'),'eventName') 将打印与元素绑定的特定事件。 你可以将事件名称作为参数传递给函数。 这将仅记录绑定到特定元素的特定事件。 例如,monitorEvents($(‘#firstName'),'click') 将打印绑定到ID为'firstName'的元素的所有 click 事件。
  • monitore($(selector),[eventName1, eventName3', .])将根据您自己的需求记录多个事件。与其传递单个事件名作为参数,不如传递包含所有事件的字符串数组。例如monitore($(#firstName),[click, focus])将记录与ID firstName元素绑定的 click事件和focus事件。
  • unmonitorevent ($(selector)):这将停止监视和打印控制台中的事件。

检查 DOM 中的一个元素

你可以直接从控制台检查一个元素:

  • inspect($(‘selector')) 将检查与选择器匹配的元素,并转到 Chrome Developer Tools中的 Elements 选项卡。 例如, inspect($(‘#firstName')) 将检查 ID为'firstName' 的元素,spect($(‘a')[3]) 将检查 DOM 中的第 4 个 a 元素。
  • $0, $1, $2 等可以帮助你获取最近检查过的元素。 例如,$0 表示最后检查的 DOM 元素,而$1 倒数第二个检查的 DOM 元素。

检索最后一个结果的值

你可以将控制台用作计算器。当你这样做的时候,你可能需要用第二个来跟踪一个计算。以下是如何从内存中检索先前计算的结果:

$_

过程如下:

2+3+4
9 //- The Answer of the SUM is 9

$_
9 // Gives the last Result

$_ * $_
81 // As the last Result was 9

Math.sqrt($_)
9 // As the last Result was 81

$_
9 // As the Last Result is 9

清除控制台和内存

如果你想清除控制台及其内存,输入如下:

clear()

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
服务器端的JavaScript脚本 Node.js 使用入门
Mar 07 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
Javascript根据指定下标或对象删除数组元素
Dec 21 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
Jun 04 Javascript
js实时获取系统当前时间实例代码
Jun 28 Javascript
javascript中setTimeout使用指南
Jul 26 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
Jan 08 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
Aug 16 Javascript
深度了解vue.js中hooks的相关知识
Jun 14 Javascript
JavaScript实现省市区三级联动
Feb 13 Javascript
Javascript Web Worker使用过程解析
Mar 16 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 #Javascript
Vue源码学习之关于对Array的数据侦听实现
Apr 23 #Javascript
vue的keep-alive中使用EventBus的方法
Apr 23 #Javascript
js继承的这6种方式!(上)
Apr 23 #Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 #jQuery
node.js基于socket.io快速实现一个实时通讯应用
Apr 23 #Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
Apr 23 #Javascript
You might like
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
python中map()与zip()操作方法
2016/02/27 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python实现TCP文件传输
2020/03/20 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
德国网上花店:Valentins
2018/08/15 全球购物
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
社区庆八一活动方案
2014/02/02 职场文书
绿色环保演讲稿
2014/05/10 职场文书
表扬通报怎么写
2015/01/16 职场文书
辩护词范文大全
2015/05/21 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技