console application_灵活使用 console 让 js 调试更简单

83384d1b38cfe5324694224ab4390f08.png

摘要: 玩转console。

  • 原文:灵活使用 console 让 js 调试更简单
  • 作者:前端小智

Fundebug经授权转载,版权归原作者所有。

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 表示小数或整数。

31aa114bd7502f74e596cac977f99e0d.png

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

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

df13b63b9adabe98887e263fdee89bef.png

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

3c55f980059ab5aedceec4832ed55224.png

它有用吗? 恩恩恩。

console.dir()

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

4f2607b7ff06549915b7ef24d0ca20cb.png

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

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

使用 console.log 查看:

04908c0775a3e74ad1ced528d58bbc27.png

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

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

19e34b64fcc0e8339a0076f6f22eaea8.png

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

console.warn()

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

3175f5745ba05b7171c5ebbafe995c69.png

不过,还有一个更大的优势,因为输出是警告而不是信息,所以你可以过滤掉所有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) 的输出要有用得多。

f2c1432317b9b165a03b8a9e304ef4dc.png

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

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

064fc286fd82ee0eaf38c4026225d3a5.png

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

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

console.assert()

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

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

60a3c13112f76060fb98cdbb6611d52a.png

有时我们需要更复杂的条件句。例如,我们已经看到了用户 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");

输出如下:

8c02d9474cafa49c1a51917a196d6537.png

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

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);

c1e94f6c6a0ba4ab13dd65c86e39c08a.png

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

选择 DOM 元素

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

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

$(‘tagName’) $(‘.class’) $You can't use 'macro parameter character #' in math mode(‘#id’) and $(‘.class #id’) 等效于document.querySelector(‘ ‘),这将返回 DOM 中与选择器匹配的第一个元素。

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

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

5309094f8798381f42a918485139953c.png

将浏览器转换为编辑器

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

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

document.body.contentEditable = true;

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

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

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

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

fb05fdd75f279dd64e806c903bee8e8f.png

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

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

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

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

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

监控事件

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

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

  • monitorEvents($(‘selector’)) 将监视与选择器的元素关联的所有事件,然后在它们被触发时将它们打印到控制台。例如,monitore($(#firstName)) 将打印 IDfirstName元素的所有事件。
  • 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();

原文:

  • Beyond console.log()
  • Things you probably didn’t know you could do with Chrome’s Developer Console

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家免费试用!

54c4020e99e842168f594b25f5193b7c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来

点击“开发者技术前线”&#xff0c;选择“星标?”13&#xff1a;21 在看|星标|留言, 真爱选自《萌萌哒的柯基》 作者&#xff1a;heroyfhttps://www.heroyf.club/2019/10/23/python_gc/前言对于python来说&#xff0c;一切皆为对象&#xff0c;所有的变量赋值都遵循着对象引…

漫谈 Linux,Windows 和 Mac

好了&#xff0c;现在来一点技术性的。这段时间收到很多人的来信&#xff08;大部分自称是菜鸟&#xff09;。他们看了我很早以前写的推崇 Linux 的文章&#xff0c;想知道如何“抛弃 Windows&#xff0c;学习 Linux”。天知道他们在哪里找到那么老的文章&#xff0c;真是好事不…

AspNet2.0页面生命周期

AspNet2.0页面生命周期 页面框架通过如下过程处理aspx文件请求: 1&#xff1a;解析aspx文件,并创建一个控件树&#xff1b; 2&#xff1a;使用控件树动态实现一个继承自Page类的类或者控件 &#xff1b; 3&#xff1a;动态编译类&#xff1b; 4&#xff1a;缓存编…

数字时钟设计verilog_数字IC设计基本概念之创建时钟

来自微信公众号 “数字芯片实验室”时序分析的一个重要部分是准确地指定时钟和相关属性&#xff0c;例如延迟&#xff08;latency&#xff09;和不确定性&#xff08;uncertainty&#xff09;。 EDA工具可以分析以下类型的时钟信息&#xff1a;时钟网络latency和 skew&#xff…

敏捷开发流程的8个步骤_敏捷开发——个体和互动高于流程和工具

敏捷开发是软件公司主流的项目管理方法&#xff0c;敏捷方法论有许多种&#xff0c;包括Scrum、极限编程(XP)以及精益(Lean)方法&#xff0c;但是它们都具有一个共同点&#xff1a;遵循敏捷宣言和敏捷原则。透明性。每一个敏捷项目成员都知道即将做什么以及项目进展如何。经常性…

ArcGis Desktop10 注册机授权方法与安装步骤

今天&#xff0c;由于需要处理一些空间数据&#xff0c;安装ArcGIS Desktop10&#xff0c;所以就把注册机的授权方法与安装过程&#xff0c;写成Blog与大家一起分享&#xff01; 第一步&#xff1a;安装 ArcGIS许可管理器。如图所示&#xff1a; 第二步&#xff1a;打开注册机&…

【转】在C#中使用SQLite

SQLite 是一个嵌入式的关系数据库系统&#xff0c;使用十分广泛。在一些数据量不大的应用程序中&#xff0c;如果使用SQLite可以极大的减少部署时的工作量。 要在C#中使用SQLite也很简单&#xff0c;只要找一个C#的wrapper就可以了&#xff0c;例如&#xff0c;我使用的就是来自…

利用ArcGIS将经纬度数据转化成平面坐标数据

经度是指某点与两极的连线与0度经线所在平面的夹角&#xff0c;国际上规定以通过英国伦敦近郊的格林尼治天文台旧址的经线作为计算经度的起点&#xff0c;即经度零度零分零秒&#xff0c;也称“本初子午线”。它东面的为东经&#xff0c;记为E&#xff0c;共180度&#xff0c;西…

电脑连接电视方法详解_笔记本连接电视方法有哪些?分享两种笔记本连接电视方法...

在如今这个快节奏的时代中,大多数年轻人的手中都会有个笔记本电脑,并且将笔记本电脑作为休闲娱乐或办公的一种设备。相比于电视屏幕尺寸,笔记本电脑的屏幕还真是小了很多。为了提高视觉上的体验,很多小伙伴会选择笔记本连接电视的方式,将笔记本中的内容转换到电视屏幕上。下面我…

完整的连接器设计手册_减速齿轮箱的设计 用一整套完整流程来说明(附PDF手册)...

减速箱减速齿轮箱设计手册获取见文章末尾图片在通用的产品设计中&#xff0c;齿轮减速箱的设计是最简单成熟的一种设计&#xff0c;因为设计流程十分清晰&#xff0c;这已经是一种很成熟的产品了&#xff0c;下面我就来说一说如何做减速齿轮箱的设计&#xff0c;以及设计的一般…

在 WinCe 平台读写 ini 文件

在上篇文章开发 windows mobile 上的今日插件时&#xff0c;我发现 wince 平台上不支持例如 GetPrivateProfileString 等相关 API 函数。在网络上我并没有找到令我满意的相应代码&#xff0c;因此我手工自己写了相应的方法。命名规则是&#xff0c;在 PC API 函数的名称前面加上…

SQL Server 兼容模式

近期一个老系统改用SQL Server 2005数据库, 从原来的2000改为2005, 默认情况下启动出错&#xff1a; Incorrect syntax near Index. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. SQL 语句中的table hint 中缺少with 关键…

通过VisualSVN的POST-COMMIT钩子自动部署代码

这段时间我们一直规划LSGO Group的学习网络平台&#xff0c;需求部分已经规划完毕&#xff0c;说做就做&#xff0c;开始搭建环境&#xff0c;由于利用PHPMYSQL技术&#xff0c;在服务器端首先安装了WAMPServer&#xff0c;以便提供Apache服务与MYSQL服务&#xff01; 在代码的…

电脑安装系统多少钱_电脑系统安装教学

双十一刚过&#xff0c;双十一购买硬件的朋友等快递到了&#xff0c;马上就要进入装机环节了&#xff0c;最近会出一系列装机之后的文章&#xff0c;比如今天的装系统教学&#xff0c;之后还会出CPU、内存超频教学。至于装机教学&#xff0c;文章很难解释清楚&#xff0c;如果怕…

数据结构与算法(C#版)第二章 C#语言与面向对象技术(上)V1.0

由于本学期我给本科生上《数据结构与算法》这门课程&#xff0c;边上边把自己的教案进行总结&#xff0c;发到CSDN上面&#xff0c;希望大家多多指正。 第二章 C#语言与面向对象技术&#xff08;上&#xff09; 一、C#语言 1.数据类型 2.常量与变量 3.运算符与表达式 4.基本语句…

ie浏览器网页版进入_IE浏览器打开网页速度很慢的解决办法

IE浏览器网页打开速度很慢怎么办&#xff1f;最近有用户反映&#xff0c;使用IE浏览器上网时&#xff0c;打开网页非常慢&#xff0c;如何解决这个问题&#xff1f;请看下文。解决办法&#xff1a;1.登录到系统桌面&#xff0c;使用组合快捷键win键r键打开运行窗口&#xff0c;…

数据结构与算法(C#版)第二章 C#语言与面向对象技术(中)V1.0

由于本学期我给本科生上《数据结构与算法》这门课程&#xff0c;边上边把自己的教案进行总结&#xff0c;发到CSDN上面&#xff0c;希望大家多多指正。 第二章 C#语言与面向对象技术&#xff08;中&#xff09; 二、面向对象技术 1.类与对象 2.封装 3.继承 4.多态

判断深度学习模型的稳定性_问题引领构建数学模型,讲练结合促进深度学习

为了立足校本教研、提升教师专业素养、构建高效课堂、提升数学教学质量&#xff0c;我校数学组于11月12日开展了&#xff02;问题引领构建数学模型&#xff0c;讲练结合促进深度学习&#xff02;主题教研活动&#xff0c;区教研员钟文丽老师莅临指导。 教研活动第一环节为王…

数据结构与算法(C#版)第二章 C#语言与面向对象技术(下)V1.0

由于本学期我给本科生上《数据结构与算法》这门课程&#xff0c;边上边把自己的教案进行总结&#xff0c;发到CSDN上面&#xff0c;希望大家多多指正。 第二章 C#语言与面向对象技术&#xff08;下&#xff09; 二、面向对象技术 5.属性 6.索引器 7.接口 8.泛型 9.类与类之间的…

win10命令提示符怎么打开_Win10系统防火墙怎么打开?ARP防火墙启用步骤

ARP防火墙怎么打开&#xff1f;ARP防火墙能够提供多种系统防护功能&#xff0c;那么Win10系统该如何开启ARP防火墙呢&#xff1f;本文就给大家介绍Win10系统电脑ARP防火墙的启用方法。操作步骤&#xff1a;1、右键点击Win10 开始菜单&#xff0c;然后选择“运行”;或者使用快捷…