首页 前端开发 Web前端入门第 53 问:JavaScript 的各种调试方法

Web前端入门第 53 问:JavaScript 的各种调试方法

任何一门编程语言,在学习之前都应该先弄清楚它的调试方法,毕竟没有不挖坑的人类!

程序一旦出现问题,第一时间就是找到问题出在哪儿,其次才是拿出解决办法。如果都找不到问题原因,那又何从谈起解决办法呢?

如何排查编程问题,这就是一门艺术了,同样的问题,也许 A 只需要 10 分钟,B 可能需要 30 分钟,C 可能束手无策。

调试方法不仅仅可以用于问题排查,还能用于运行结果输出,能让枯燥的学习多那么一点点乐趣~~

PC 端调试手段
console 输出
浏览器内置的输出方法,可以很方便地看到运行结果,也能帮助我们定位程序问题。常用方法:

console.log() // 输出 log 日志级别的变量值或信息。
console.info() // 输出 info 信息级别的变量值或信息。
console.error() // 输出 error 错误级别的变量值或信息。
console.warn() // 输出 warn 警告级别的变量值或信息。
console.trace() // 输出函数调用堆栈
console.table() // 以表格形式展示数组/对象
console.time() // 计时器
console.timeEnd() // 计时结束,查看计时结果
console 掌握以上几个常用方法已经足够了,当然它还有其他一些不太常用的方法,比如:

console.assert() // 断言
console.clear() // 清空控制台
console.count() // 计数器
console.countReset() // 重置计数器
console.debug() // 输出调试信息
console.dir() // 输出对象结构
console.dirxml() // 输出 XML 结构
console.group() // 分组
console.groupCollapsed() // 收缩分组
console.groupEnd() // 结束分组
console.profile() // 开始性能分析(非标准,存在兼容性)
console.profileEnd() // 结束性能分析(非标准,存在兼容性)
console.timeLog() // 输出计时器
console.timeStamp() // 输出时间戳(非标准,存在兼容性)
提到 console ,那么就不得不提浏览器的开发者工具了,因为 console 输出的内容,都是在开发者工具--控制台中展示的:
示例:
console.time() // 开始计时器
console.log('日志信息', 'hello world', {a: 'b'})
console.info('信息', 'hello world', {a: 'b'})
console.error('错误信息', 'hello world', {a: 'b'})
console.warn('警告信息', 'hello world', {a: 'b'})
console.trace('追踪信息')
console.table([{a: 'b'}, {a: 'c'}])
console.timeEnd() // 结束计时器,查看计时结果
以上代码可以直接在开发者工具--控制台中执行,看看执行效果:

您的浏览器控制台可能不支持粘贴代码,会提示让您输入 allow pasting,可在控制台中输入 allow pasting 之后回车就能粘贴代码了!

注意看最后的 default: xxx ms,这表示 time 到 timeEnd 的执行时间,截图中就表示我们代码执行耗时 0.66ms,所以这两个方法也能用于我们的代码性能检测,分析出哪些代码耗时太长,便可以针对耗时长的代码做优化。

debugger 语句
在代码中插入 debugger;,当浏览器开发者工具打开时自动进入中断。

const test = '112233';
function foo() {
const test1 = '123';
const test2 = '321';
const test3 = test1 + test2;
debugger;
}
foo()
控制台执行以上代码,开发者工具将会进入中断,此时可以看到当前程序状态:

控制按钮 可以程序继续执行、跳过下一个函数调用、进入下一个函数、跳出当前函数、单步调试、停用断点等。
监视 可以添加自定义表达式查看程序状态。。
本地 和 全局 可以查看当前程序作用域中的变量。
调用堆栈 可以查看当前程序的调用顺序。

断点调试
可在 源代码/来源(Sources) 面板中添加断点进行调试,与 debugger 类似,不同地方在于 debugger 语句需要添加在代码中,而 断点调试 只需要在面板中打上断点即可。

示例代码:

<script>
const test = '112233';
function foo() {
const test1 = '123';
const test2 = '321';
const test3 = test1 + test2;
return test3;
}
foo()
</script>
断点调试演示:

网络调试
开发者工具中的网络(Network)面板,可以查看所有的网络请求,包括请求头、响应头、响应内容、网络耗时等等。

也可以对网络请求节流,模拟低网速环境下网页响应状态等。


性能、内存面板
开发者工具中的两个高阶技能,一般多用于性能优化。

性能(Performance)面板:录制代码执行过程,分析耗时函数
内存(Memory)面板:抓取堆快照,排查内存泄漏。

开发者工具的其他手段
日志点:右键行号设置,无需修改代码输出日志。
条件断点:仅在满足条件时中断(如循环特定索引)。
黑盒脚本(Blackbox):忽略第三方库/框架的内部代码,聚焦业务逻辑调试。

框架专用工具
React Developer Tools 检查 React 组件状态、Props及Hooks,分析组件渲染性能。

Vue Devtools 查看Vue组件树、状态和事件。

善用无痕模式
浏览器无痕模式,可以屏蔽浏览器的三方插件,避免缓存影响。有时候某个问题可能就是某个插件或者三方缓存造成的,这时候使用无痕模式可以分分钟定位问题。

移动端调试手段
移动端没有内置开发者工具,程序调试不像 PC 端那么方便,这时候必须借助相关开源工具了,比如:

vConsole
vConsole:腾讯开源的轻量级网页控制台,集成日志、网络请求、设备信息查看等功能。

使用方法:必须在代码中引入并开启工具。

<script src="https://cdn.bootcdn.net/ajax/libs/vConsole/3.15.1/vconsole.min.js"></script>
<script>
new VConsole();
</script>
效果:

Eruda
Eruda:功能更丰富的控制台,支持元素检查、性能分析、本地存储查看等。

使用方法:必须在代码中引入并开启工具。

<script src="https://cdn.bootcdn.net/ajax/libs/eruda/3.4.1/eruda.min.js"></script>
<script>
eruda.init();
</script>
效果:
Chrome远程调试
手机端 Chrome 浏览器,通过 USB 线连接电脑,可在电脑端查看手机端网页的调试信息。

1、手机开启USB调试模式(开发者选项中)。
2、用USB连接电脑,Chrome访问 chrome://inspect/#devices。
3、点击对应页面下的 Inspect,直接使用PC版DevTools调试。

抓包工具
PC 端代表软件:Charles、Fiddler。

Node.js抓包工具:Whistle。

手机端抓包APP:HttpCanary(Android)、Stream(iOS)。

抓包工具可不仅仅用于抓包。

1、可以用来分析网络请求,比如查看各种请求内容是否正常。
2、可以模拟网络请求各种状态,比如请求超时、无网络、404、500等。
3、可以伪造请求内容,比如伪造一个接口的响应数据,用于模拟后端接口返回数据。

手机抓包步骤:

1、PC 安装 Charles 或者 Fiddler,设置代理端口(默认8888)。
2、手机与PC同一网络,Wi-Fi设置手动代理(IP 为 PC 内网地址,端口8888)。
3、安装证书以捕获HTTPS请求。

以 Fiddler 为例:

所有的 http 和 https 请求都会被软件捕获,我们可以查看所有被捕获的请求,也可以修改它们。

终极手段
有时候可能所有的调试手段都用上了,但就是找不到问题,这时候可以尝试删除部分代码,直到删到没问题为止,基本就能定位到有问题的代码了。

写在最后
调试手段不仅仅可以用于开发调试,还能用于线上环境问题定位,模拟程序的各种异常情况,提升程序的健壮性。

站星网

任何一门编程语言,在学习之前都应该先弄清楚它的调试方法,毕竟没有不挖坑的人类!程序一旦出现问题,第一..

为您推荐

Web前端入门第 76 问:JavaScript 鼠标事件(mouse) enter/leave 和 over/out 区别

题外话在考察事件基础的时候,会经常被问及 click、mousedown、mouseup 它们三者执行的先后顺序是怎样的?如果平时没太注意,这细节可能就会忽略,毕竟很少会在同一个元素上面同时绑定这三个事件~~直接上示例:<div ..

Web前端入门第 67 问:JavaScript 中的面向对象编程

此 对象 非彼对象啊,不要理解错了哦~~面向对象编程 这个概念在 Java 编程语言中用得比较多,JS 同时支持 面向对象编程 和 函数式编程。像大名鼎鼎的 React 和 Vue 他们都有两种开发风格,比如:Vue 中的 组合式API ..

Web前端入门第 57 问:JavaScript 数据类型与类型转换

在程序语言中,数据类型是基础,一切程序都是建立在基础数据之上。如果说程序如同万丈高楼平地起,那么数据类型就像沙、石、钢筋、水泥等等最基础的原料。一样的高楼,不同的人,用相同的原料,造的方法也会有千般变..

JavaScript实现图片上传预览及获取图片尺寸和大小的完整指南

在现代Web开发中,提供图片上传的预览功能以及获取图片的尺寸和大小信息,已成为提升用户体验的重要手段。本文将详细介绍如何使用JavaScript实现这些功能,帮助你在用户上传图片前进行有效的验证和优化。一、实现图..

Web前端入门第 60 问:JavaScript 各种数组定义与数组取值方法

数组可以算是程序里面最常用的数据结构了,但凡网页上任何一个列表数据,基本都是以数组的形式存在,像表格、banner图、菜单列表、商品列表,分类列表等等,在前端领域都是以数组处理。数组的定义JS 的数组花样很多..

Web前端入门第 55 问:JavaScript 严格模式与非严格模式区别

JavaScript 默认是非严格模式的,可以通过 "use strict"; 启用严格模式。此声明语句可以放在 JS 文件顶部,也可以放在函数内部。启用严格模式1、外部脚本在 JS 文件开头声明,内部脚本在 <script> 标签开头声明,声..

Web前端入门第 54 问:JavaScript 3 种书写位置及 script 标签的正确存放位置

JS 的代码并没有强制规定放在 HTML 中的某个位置,如果您有使用过开发者工具查看过网页源码,那么您会看到很多 JS 代码都以 .js 文件的形式存放,并且放在了 HTML 文件最后,也就是 </body> 结束标签之前。但如果仔..

Web前端入门第 52 问:JavaScript 的应用领域

截至目前,您应该对前端的 HTML + CSS 应该有了很清楚的认知,至少实现一个静态网页已经完全不在话下了。当然,CSS 功能绝不止这些,一些不太常用的 CSS 相关知识,后续将通过案例进行分享。那么咱们接下来看看 Java..

.NET C# 过滤从富文本编辑器html里的Javascript脚本

富文本编辑器在允许用户输入丰富内容的同时,也带来了跨站脚本攻击(XSS)的风险。过滤提交的 HTML 中的 <script> 脚本是防止跨站脚本攻击(XSS)的关键步骤。在 .NET C# 服务端过滤 <script> 脚本主要有以下几种方..

软件产品开发中常见的10个问题及处理方法

常见的10个问题#产品开发中常见的10个问题思维导图需求相关#1. 需求不明确#在日常工作中,需求来源于用户、老板、客户、竞品分析、业务部门、产品经理等,这些人或部门会提出需求,因为他们不是产品经理,提出的需求..

轻松学习 JavaScript函数中的默认参数

JavaScript函数可以有默认参数值。通过默认函数参数,你可以初始化带有默认值的正式参数。如果不初始化具有某些值的参数,则该参数的默认值为undefined。请看下列代码:function foo(num1){console.log(num1);}foo()..

一个提升运营/营销转化率的万能方法!

之前,笔者有分享过说我最喜欢的增长是可复制可持续的增长,它一般都会有三个关键过程:首先是小范围测试,低成本试错,也就是最小可行性验证,让ROI最大化。然后是把测试的最优结果整理为可执行的标准化化流程。前..

JavaScript API 设计原则详解

前言本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来。很难做到详..

JavaScript 中精度问题以及解决方案

JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示。其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在ES5 规范中指出了指数位E的取值范围是[-1074, 971]。精度问题汇总想用有限..

JavaScript 六种继承方式

继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的。原型链首先得要明白什么是原型链,在一篇文章看懂proto和prototype的关系及区别中讲得非常详细..

JavaScript 事件委托详解

基本概念事件委托,通俗地来讲,就是把一个元素响应事件(click、focus……)的函数委托到另一个元素;一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应..

JavaScript 中的遍历详解

编程这么多年,要是每次写遍历代码时都用 for 循环,真心感觉对不起 JavaScript 语言~对象遍历为了便于对象遍历的测试,我在下面定义了一个测试对象obj。测试对象// 为 Object 设置三个自定义属性(可枚举)Object.p..

学习最重要是方法,管理最重要是高度

技术学习要兼顾深度和广度夯实技术基础这么多年来,我面试了很多人。我越发感到「技术基础」非常重要。很多技术的本质是一样的。技术基础足够好的话,学东西可以非常快。往下到操作系统层面,甚至计算机硬件层面,你..

web前端开发2018年12月找工作总结

2018年的冬天额外的冷,由内致外...作为一名刚刚踏入社会的实习生,可谓是狠狠的体验了一把什么叫社会(同时也感叹父母赚钱真的很不容易)前几天看见这样一句话"如果你不知道社会的辛苦,要么是有人替你扛了,要么是还没轮..

值得探索的 8 个机器学习 JavaScript 框架

JavaScript开发人员倾向于寻找可用于机器学习模型训练的JavaScript框架。下面是一些机器学习算法,基于这些算法可以使用本文中列出的不同JavaScript框架来模型训练:简单的线性回归多变量线性回归逻辑回归朴素贝叶斯..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制