首页 / 资讯中心 / 文章详情

jstips 50:实用的 console.log 调试技巧——条件断点日志与函数源码打印

jstips 50:实用的 console.log 调试技巧——条件断点日志与函数源码打印 ★ FEATURED ARTICLE
教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载导读本文基于 jstips 社区的第 50 号技巧英文原文中文译文展开。核心解决两个高频调试痛点一是在不打断程序执行的前提下让函数每次被调用时都能自动向控制台输出关键值——这通过条件断点实现二是快速查看一个函数变量的完整源码——通过字符串强制转换实现。读完本文你将掌握这两套零依赖、纯浏览器 DevTools 即可上手的实用技巧并能顺带理解其背后的短路求值、函数toString()等 JavaScript 语言机制。一、背景来自 jstips 的“日志技巧”jstips 是一个持续收录“短小且实用 JavaScript 技巧”的开源项目README 中明确将其定位为帮助开发者改进编码的速读型知识库README.md。在项目维护的 Tips 列表中第 50 号技巧即 “Helpful Console Logging Tricks”实用控制台日志技巧README.md#L59由社区作者 zackhall 提交并先后被翻译为中文、西班牙语、繁体中文等多个版本如 西班牙语版、繁体中文版。这一技巧聚焦一个极其日常却容易被忽视的场景调试时想观察某个值又不想反复手动添加、删除console.log代码。原文给出了两条思路下文分别展开并结合仓库内其他相关技巧短路求值、tap 调试、性能测量等做纵深补充。二、技巧一用条件断点“无痛”输出 log2.1 问题场景当你希望函数每次被调用时都在控制台打印一个值常规做法是在函数体内插入console.log(...)调试完再删除。这种做法有两个麻烦需要修改源码可能影响后续调试定位高频调用的函数会刷屏却无法直接感知调用次数。jstips 给出的解法是利用开发工具DevTools的条件断点conditional breakpoint功能。做法很简单——打开开发工具定位到你想打印数据的函数所在行设置一个断点并在断点条件中输入console.log(data.value) false2.2 原理剖析短路求值与断点触发条件条件断点的触发规则是只有当条件表达式求值结果为true时页面线程才会在该断点处暂停。而console.log(data.value) false这个表达式的结果恒为false因此永远不会暂停页面——但它左侧的console.log(data.value)会被正常执行把值打印到控制台。这一行为背后正是 JavaScript 的**短路求值short-circuit evaluation**机制。仓库中第 27 号技巧对此有专门讲解2016-01-27-short-circuit-evaluation-in-js.md对于逻辑与当第一个运算数的值为false时其结果必定为false第二个运算数根本不会被求值反之当第一个运算数为true时才会继续求值右侧表达式。套用到console.log(foo) false上console.log(foo)先执行输出日志其返回值是undefined假值由于左侧已为假值短路生效右侧false甚至不会被额外“消费”整个表达式直接确定为false断点条件不成立 → 不暂停 → 但日志已经打印。换句话说这是一条“只打日志、不中断执行”的巧用把断点条件框变成了一个可复用的日志挂载点。2.3 应用扩展统计函数/回调被调用次数原文明确指出这一技巧也可以用来统计某个函数或回调被调用了多少次。只需把条件改为console.count(myCallback) false或者维持console.log(...) false的形态在日志输出中自行观察出现次数。由于断点条件每次命中该行都会求值一次console.log每执行一次就产生一行输出调用次数一目了然且全程无需改动业务代码。2.4 各平台设置方法不同浏览器 DevTools 的条件断点入口略有差异原文分别给出了 Edge、Chrome、Firefox、Safari 的官方文档指引。设置的核心思路一致平台设置方式Chrome / Edge在 Sources 面板中右键单击行号选择 “Add conditional breakpoint”添加条件断点在输入框中填写条件表达式Firefox在 Debugger 面板中右键单击行号选择“添加条件断点”输入条件Safari在 Sources / Debugger 面板中右键行号设置条件断点conditional breakpoint注条件断点在老版本 Safari 中可能写作 “Condition” 或通过 “Breakpoints” 侧栏编辑具体交互请以你所使用 DevTools 版本的界面为准。三、技巧二把函数打印成源码3.1 问题场景你是否遇到过这样的情况把函数变量丢给console.log控制台里显示的却只是一行晦涩的引用信息如ƒ foo() { [native code] }或函数名加() 的摘要看不到函数体的完整代码3.2 一行代码解决空字符串拼接强制转换jstips 给出的最快解法是把函数与空字符串做拼接强制其转换为字符串console.log(funcVariable );JavaScript 在字符串拼接运算中会对非字符串操作数执行toString 强制转换。函数对象在转换为字符串时会调用其内部toString()方法返回函数源码文本对于普通函数、箭头函数均适用内置原生函数通常返回function xxx() { [native code] }之类的占位。因此funcVariable 直接得到了完整可读的源码文本并交给console.log输出。3.3 边界与注意点该技巧对普通声明函数、函数表达式、箭头函数均有效对原生内置函数如Array.prototype.map只能得到[native code]占位文本若函数是通过new Function()动态创建的toString()会返回其源码文本从源码结构看这一技巧不依赖任何库或运行时 API任何支持字符串拼接的环境浏览器、Node.js都能使用。3.4 仓库内关联佐证仓库中第 19 号技巧《安全的字符串拼接》也涉及“拼接”的副作用讨论2016-01-19-safe-string-concatenation.md其示例展示了.concat(one, two, three)与one two three的差异当操作数含数字时可能触发算术运算或产生非预期拼接结果。而funcVariable 之所以安全正是因为函数的toString()不会受到算术影响左侧永远是对象到字符串的转换不存在数字相加的分支因此可以放心使用这一写法来读取函数源码。四、延伸仓库内其他 console 调试技巧作为补充jstips 仓库还收录了多个与本文主题同源的 console 调试技巧可以在实际工作中组合使用4.1 tap在链式调用中“偷看”中间值第 65 号技巧2017-03-16-tapping-for-quick-debugging.md提供了一个更优雅的调试函数function tap(x) { console.log(x); return x; }其思路与“条件断点打日志”一脉相承打印但不改变程序行为。它特别适合在函数式链式调用中插入例如bank_totals_by_client(tap(bank_info(1, banks)), table)或.filter(c tap(c).balance 25000)逐段定位数据流中出问题的环节而无需打断链路。进阶版tap(x, fn x x)还允许在打印前对值做一次转换。4.2 console.time / console.timeEnd性能测量第 13 号技巧2016-01-13-tip-to-measure-performance-of-a-javascript-block.md演示了用console.time(label)与console.timeEnd(label)快速测量代码块执行耗时配合本文的条件断点技巧可以实现“按需观测 耗时统计”的完整调试链路。该文档同时提醒Mozilla 官方不建议在生产环境使用这些 API建议仅在开发阶段使用。4.3 逗号操作符表达式序列的求值顺序第 57 号技巧2016-08-10-comma-operaton-in-js.md讲解的逗号操作符从左到右依次求值并返回最后一个表达式与本文“条件断点中表达式恒为 false 的求值顺序”属同类语言机制理解它们有助于写出更可控的调试表达式。五、使用建议与小结技巧适用场景核心代码关键前提条件断点打日志函数高频调用时持续观测某个值、统计调用次数且不想改源码console.log(data.value) false支持条件断点的 DevTools依赖短路求值打印函数源码快速查看函数变量完整代码console.log(funcVariable )函数为普通 JS 函数而非原生内置函数两点实践提醒仅用于开发调试条件断点、console.*系列 API 都会带来额外开销且部分浏览器厂商不建议在生产环境使用发布前应移除或通过开关禁用理解底层机制比记住写法更重要 false之所以“只打日志不暂停”本质是短路求值 条件断点触发语义的组合 之所以能打印源码本质是函数对象的toString()强制转换。掌握了这两条语言机制你还可以举一反三例如把 false换成其他恒假表达式、把字符串拼接换成模板字符串注意模板字符串同样会触发toString()。上述技巧的原始内容均可在本仓库的_posts目录中查阅中文、英文及其他语言版本并存便于对照学习。赞分享教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载相关推荐PyPTO Tiling 配置实战用 Cube/Vector TileShape 掌控 Ascend NPU 的性能上限PyPTO Tiling 配置实战用 Cube/Vector TileShape 掌控 Ascend NPU 的性能上限 本篇技术指南围绕 PyPTOPar教程Omni远程调试断点技巧条件断点与日志点的使用Omni远程调试断点技巧条件断点与日志点的使用 在日常开发中调试Debugging是解决问题的关键环节。传统断点调试常常会中断程序执行流程而Omni开发工具WeChatMsg重塑数字记忆主权三步掌控微信聊天记录的完整指南WeChatMsg重塑数字记忆主权三步掌控微信聊天记录的完整指南 在数字洪流中我们的对话正以惊人速度消失。你是否意识到那些看似普通的微信聊天记录其实承载上一篇番茄小说下载器完整指南3种界面任你选打造专属离线图书馆下一篇终极Gofile下载方案3分钟破解下载速度瓶颈创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站