JavaScript 基础教程

JavaScript 首页 JavaScript 路线图 JavaScript 概述 JavaScript 功能特性 JavaScript 启用 JavaScript 位置 JavaScript 语法 JavaScript Hello World JavaScript Console.log() JavaScript 注释 JavaScript 变量 JavaScript let 语句 JavaScript 常量 JavaScript 数据类型 JavaScript 类型转换 JavaScript 严格模式 JavaScript 保留关键字

JavaScript 运算符

JavaScript 运算符 JavaScript 算术运算符 JavaScript 比较运算符 JavaScript 逻辑运算符 JavaScript 位运算符 JavaScript 赋值运算符 JavaScript 条件运算符 JavaScript typeof 运算符 JavaScript 空值合并运算符 JavaScript 安全赋值运算符 JavaScript 删除运算符 JavaScript 逗号运算符 JavaScript 分组运算符 JavaScript Yield 运算符 JavaScript 展开运算符 JavaScript 幂运算符 JavaScript 运算符优先级

JavaScript 控制流

JavaScript If...Else JavaScript While 循环 JavaScript For 循环 JavaScript For...in JavaScript For...of JavaScript 循环控制 JavaScript Break 语句 JavaScript Continue 语句 JavaScript Switch Case JavaScript 用户定义迭代器

JavaScript 函数

JavaScript 函数 JavaScript 函数表达式 JavaScript 函数参数 JavaScript 默认参数 JavaScript Function() 构造函数 JavaScript 函数提升 JavaScript 自调用函数 JavaScript 箭头函数 JavaScript 函数调用 JavaScript 函数 call() 方法 JavaScript 函数 apply() 方法 JavaScript 函数 bind() 方法 JavaScript 闭包 JavaScript 变量作用域 JavaScript 全局变量 JavaScript 智能函数参数

JavaScript 对象

JavaScript Number JavaScript Boolean JavaScript Strings JavaScript Arrays JavaScript Date JavaScript DataView JavaScript Handler JavaScript Math JavaScript RegExp JavaScript Symbol JavaScript Sets JavaScript WeakSet JavaScript Maps JavaScript WeakMap JavaScript 可迭代对象 JavaScript Reflect JavaScript TypedArray JavaScript 模板字面量 JavaScript 带标签的模板

面向对象的 JavaScript

JavaScript 对象 JavaScript 类 JavaScript 对象属性 JavaScript 对象方法 JavaScript 静态方法 JavaScript 显示对象 JavaScript 对象访问器 JavaScript 对象构造函数 JavaScript 原生原型 JavaScript ES5 对象方法 JavaScript 封装 JavaScript 继承 JavaScript 抽象 JavaScript 多态 JavaScript 解构 JavaScript 解构赋值 JavaScript 对象解构 JavaScript 数组解构 JavaScript 嵌套解构 JavaScript 可选链式调用 JavaScript 全局对象 JavaScript Mixins (混合) JavaScript 代理

JavaScript 版本

JavaScript 历史 JavaScript 版本 JavaScript ES5 JavaScript ES6 ECMAScript 2016 ECMAScript 2017 ECMAScript 2018 ECMAScript 2019 ECMAScript 2020 ECMAScript 2021 ECMAScript 2022

JavaScript 异步

JavaScript 异步 JavaScript 回调函数 JavaScript Promises JavaScript Async/Await JavaScript Microtasks (微任务) JavaScript Promises JavaScript Promises 链 JavaScript 定时事件 JavaScript setTimeout() JavaScript setInterval()

JavaScript Cookies

JavaScript Cookies JavaScript Cookie 属性 JavaScript 删除 Cookies

JavaScript 浏览器 BOM

JavaScript 浏览器对象模型 JavaScript Window 对象 JavaScript Document 文档对象 JavaScript Screen 对象 JavaScript History 对象 JavaScript Navigator 对象 JavaScript Location 对象 JavaScript Console 对象

JavaScript Web APIs

JavaScript Web API JavaScript History API JavaScript Storage API JavaScript Forms API JavaScript Worker API JavaScript Fetch API JavaScript Geolocation API

JavaScript 事件

JavaScript 事件 JavaScript DOM 事件 JavaScript addEventListener() JavaScript 鼠标事件 JavaScript 键盘事件 JavaScript 表单事件 JavaScript 窗口/文档事件 JavaScript 事件委托 JavaScript 事件冒泡 JavaScript 事件捕获 JavaScript 自定义事件

JavaScript 错误处理

JavaScript 错误处理 JavaScript try...catch JavaScript 调试 JavaScript 自定义错误 JavaScript 扩展错误

JavaScript 重要关键字

JavaScript this 关键字 JavaScript void 关键字 JavaScript new 关键字 JavaScript var 关键字

JavaScript HTML DOM

JavaScript HTML DOM JavaScript DOM 方法 &属性 JavaScript DOM 文档 JavaScript DOM 元素 JavaScript DOM 属性 (Attr) JavaScript DOM 表单 JavaScript 修改 HTML JavaScript 修改 CSS JavaScript DOM 动画 JavaScript DOM 导航 JavaScript DOM 集合 JavaScript DOM NodeList JavaScript DOM DOMTokenList

JavaScript 高级章节

JavaScript 冒泡排序算法 JavaScript 循环引用错误 JavaScript 使用 Jest 进行代码测试 JavaScript CORS 处理 JavaScript 数据分析 JavaScript 死区 JavaScript 设计模式 JavaScript Engine 和 Runtime JavaScript 执行上下文 JavaScript 函数组合 JavaScript 不可变性 JavaScript Kaboom.js JavaScript 词法作用域 JavaScript 本地存储 JavaScript 记忆化 JavaScript 压缩 JS JavaScript 可变性 vs 不可变性 JavaScript 包管理器 JavaScript 解析 S 表达式 JavaScript 原型继承 JavaScript 响应式 JavaScript Require 函数 JavaScript Selection API JavaScript SessionStorage JavaScript SQL CRUD 操作 JavaScript 增强排序 JavaScript 临时死区 JavaScript 节流 JavaScript TRPC 库 JavaScript 真值和假值 JavaScript 上传文件 JavaScript 日期比较 JavaScript 递归 JavaScript 数据结构 JavaScript Base64 编码 JavaScript 回调函数 JavaScript 当前日期/时间 JavaScript 日期验证 JavaScript 过滤方法 JavaScript 生成颜色 JavaScript HTTP 请求 JavaScript 插入排序 JavaScript 延迟加载 JavaScript 链表 JavaScript 嵌套循环 JavaScript 空值检查 JavaScript 获取当前 URL JavaScript 图算法 JavaScript 高阶函数 JavaScript 空字符串检查 JavaScript 表单处理 JavaScript 函数式编程 JavaScript 形参 vs 实参 JavaScript 原型 JavaScript 响应式编程 JavaScript Reduce 方法 JavaScript Rest 运算符 JavaScript 短路 JavaScript 未定义检查 JavaScript 单元测试 JavaScript 验证 URL

JavaScript 杂项

JavaScript Ajax JavaScript 异步迭代 JavaScript Atomics 原子对象 JavaScript Rest 参数 JavaScript 页面重定向 JavaScript 对话框 JavaScript 页面打印 JavaScript 表单验证 JavaScript 动画 JavaScript 多媒体 JavaScript 图像映射 JavaScript 浏览器 JavaScript JSON JavaScript 多行字符串 JavaScript 日期格式 JavaScript 获取日期方法 JavaScript 设置日期方法 JavaScript 模块 JavaScript 动态导入 JavaScript BigInt JavaScript Blob JavaScript Unicode JavaScript 浅拷贝 JavaScript 调用堆栈 JavaScript 引用类型 JavaScript IndexedDB JavaScript 点击劫持攻击 JavaScript 柯里化 JavaScript 图形 JavaScript Canvas 画布 JavaScript 防抖 JavaScript 性能 JavaScript 代码风格指南

JavaScript 实用资源

JavaScript 面试题 JavaScript 速查表 JavaScript 函数


JavaScript - 调试

什么是调试?

JavaScript 中的调试是检查 JavaScript 代码、查找错误并修复的过程。开发人员在编写代码时难免会犯一些错误。这些错误可能是逻辑错误、语法错误或运行时错误。程序或脚本中的错误被称为 bug。

查找和修复 bug 的过程称为调试,是开发过程的正常组成部分。本节介绍一些可以帮助您完成调试任务的工具和技术。

让我们来看看不同的调试方法。

使用 JavaScript 调试器

调试器是一个将脚本执行的所有方面置于程序员控制之下的应用程序。调试器通过一个界面提供对脚本状态的细粒度控制,该界面允许您检查和设置值以及控制执行流程。

脚本加载到调试器后,可以一次运行一行,也可以指示其在特定断点处暂停。执行暂停后,程序员可以检查脚本及其变量的状态,以确定是否存在问题。您还可以观察变量值的变化。

如今,所有现代浏览器都内置了调试器。您可以使用浏览器的控制台来调试 JavaScript 代码。

如何在浏览器中打开控制台?

在本节中,您将学习如何在不同的浏览器中打开控制台。

在 Chrome 中打开控制台

按下以下按键。

  • Windows/Linux − Ctrl + Shift + I or Ctrl + Shift + J

  • macOs − Cmd + Option + I or Cmd + Option + J

或

  • 步骤 1 − 打开 Chrome 浏览器并在新窗口中打开网页。

  • 步骤 2 − 在网页的任意位置点击鼠标右键。

  • 步骤 3 − 将会弹出菜单。选择最后一个选项"检查"。

  • 步骤 4 − 它将打开 Chrome 开发者工具。

  • 步骤 5 − 转到控制台选项卡。

在 Firefox 中打开控制台

按下以下按键。

  • Windows/Linux − Ctrl + Shift + I 或 Ctrl + Shift + J

  • macOs − Cmd + Option + I 或 Cmd + Option + J

或

  • 步骤 1 − 打开 Firefox 网页浏览器并在新窗口中打开网页。

  • 步骤2 − 在网页的任意位置点击鼠标右键。

  • 步骤 3 − 从弹出菜单中选择最后一个选项"检查(Q)"。

  • 步骤 4 − 它将打开开发者工具。

  • 步骤 5 − 您可以从"检查器"选项卡移动到"控制台"选项卡。

在 Microsoft Edge 中打开控制台

按下以下按键。

  • Windows/Linux − Ctrl + Shift + I or Ctrl + Shift + J

  • macOs − Cmd + Option + I or Cmd + Option + J

或

  • 步骤 1 − 打开 Microsoft Edge 浏览器。

  • 步骤 2 − 右键单击​​网页上的任意位置。

  • 步骤 3 − 在弹出菜单中点击"检查"。

  • 步骤 4 − 您将看到开发者工具已打开。

  • 步骤 5 − 接下来,您可以在开发者工具中将"元素"选项卡更改为"控制台"选项卡。

在 Safari 中打开控制台

按下以下按键。

  • Windows/Linux − Ctrl + Shift + I 或 Ctrl + Shift + J

  • macOs − Cmd + Option + I 或 Cmd + Option + J

或

  • 步骤 1 − 打开 Safari 网页浏览器。

  • 步骤 2 − 从顶部菜单栏打开 Safari 主菜单。

  • 步骤 3 − 在下拉菜单中选择"偏好设置"。接下来,选择"高级"选项。

  • 步骤 4 − 勾选"在菜单栏中显示'开发'菜单"复选框以启用开发者工具。接下来,关闭偏好设置窗口。

  • 步骤 5 − 接下来,重新打开主菜单并选择"开发"。之后,选择"显示错误控制台"。

在 Opera 中打开控制台

按下以下按键。

  • Windows/Linux − Ctrl + Shift + I or Ctrl + Shift + J

  • macOs − Cmd + Option + I or Cmd + Option + J

或

  • 步骤 1 − 打开 Opera 浏览器。

  • 步骤 2 − 从顶部角落打开主菜单。

  • 步骤 3 − 在主菜单中,选择"开发者"。它将打开子菜单。

  • 步骤 4 − 在子菜单中,选择"开发者工具"。

  • 步骤 5 − 接下来,选择"控制台"。它将打开控制台。

使用 console.log() 方法

console.log() 方法会在 Web 浏览器的控制台中打印消息。它可以打印原始值、对象、变量值等。

您可以在要调试的控制台中打印变量的值。

语法

用户可以按照以下语法使用 console.log() 方法。

Console.log(val1, val2, ...);

console.log() 方法接受以逗号分隔的参数,并在 Web 浏览器的控制台中打印。

示例

在下面的代码中,我们将 num1 和 num2 变量的值相加。在浏览器中,你可以看到总和是 32,而不是 5。

因此,你需要调试代码。

当你将 num1 和 num2 的类型打印到控制台时,它显示 num1 的类型是字符串。因此,它会将 num2 变量的值转换为字符串,并将其附加到 num1 的值上。

<html>
<body>
   <div id = "output"> </div>
   <p>Note: To see the resullt in console, please open it before you run the code.</p>
   <script>
      let num1 = "3";
      let num2 = 2;
      let sum = num1 + num2;
      document.getElementById("output").innerHTML = "The sum is: " + sum;
      console.log("typeof num1 is " + typeof num1);
      console.log("typeof num2 is " + typeof num2);
   </script>
</body>
</html>

输出

The sum is: 32
Note: To see the resullt in console, please open it before you run the code.

它将在 Web 控制台中产生以下结果 -

typeof num1 is string
VM75616:7 typeof num2 is number

示例

在下面的代码中,我们有一个包含各种属性的 Person 对象。我们在 Web 浏览器中打印 Person 对象的 firstname 和 lastname 属性。结果显示 undefined。

要查找错误,您需要调试代码。接下来,我们在控制台中打印该对象,发现 Person 对象不包含 firstname 和 lastname 属性;相反,它包含的是 name 属性。

<html>
<body>
   <div id = "demo"> </div>
   <p>Note: To see the resullt in console, please open it before you run the code.</p>
   <script>
      let output = document.getElementById("demo");
      let person = {
         name: "John",
         age: 25,
         city: "New York"
      }
      output.innerHTML = "The name of the person is: " + person.name + "<br>";
      output.innerHTML += "The city of the person is: " + person.city + "<br>";
      console.log(person);
   </script>
</body>
</html>

输出

The name of the person is: John
The city of the person is: New York
Note: To see the resullt in console, please open it before you run the code.

它将在 Web 控制台中产生以下结果 -

{name: 'John', age: 25, city: 'New York'}

使用 debugger 关键字

您可以前往浏览器控制台的"源代码"面板来调试代码。

"debugger"关键字允许您强制停止 JavaScript 代码的执行。

停止 JavaScript 代码的执行允许您逐行调试代码。

一旦您发现错误或一切正常,您就可以恢复 JavaScript 代码的执行。

您可以打开控制台并在浏览器中运行以下代码。它会自动暂停代码,您可以观察变量的值来调试代码。

示例

以下示例与上述示例相同。我们在打印对象属性值之前添加了"debugger"关键字。

它将在打印属性值之前暂停代码的执行。之后,当您点击恢复按钮时,它将恢复代码的执行。

<html>
<body>
   <div id = "demo"> </div>
   <script>
      const output = document.getElementById("demo");
      const person = {
         name: "John",
         age: 25,
         city: "New York"
      }
      debugger;
      output.innerHTML = "The name of the person is: " + person.name + "<br>";
      output.innerHTML += "The city of the person is: " + person.city;
   </script>
</body>
</html>

输出

The name of the person is: John
The city of the person is: New York

您将在控制台中看到类似以下屏幕截图的结果。要查看控制台结果,请在运行代码之前打开它。

Debugger Keyword

上图显示了浏览器窗口顶部的暂停按钮以及右下角的对象或变量。这样,您可以检查变量值并调试代码以修复错误。

在浏览器的调试器中设置断点

设置断点与使用"debugger"关键字调试 JavaScript 代码相同。所以,这是一种替代方法。

在"源代码"面板中,您可以点击要添加断点的行号,如下图所示。

之后,当您执行 JavaScript 代码时,它会停止代码的执行,您可以在右侧观察变量值。

调试断点

示例

我们在下面的示例代码中定义了 test() 函数。test() 函数将 str1 和 str2 字符串连接起来。

我们在开发者工具的浏览器中打开了"源代码"面板。之后,我们在"let res = str1.concat(str2);"行添加了断点。因此,调试器将在此行停止代码的执行,您可以单击恢复按钮来恢复代码的执行。

<html>
<body>
   <div id = "output">The resultant string after appending str2 to str1 is: </div>
   <script>
      function test() {
         let str1 = "Hi";
         let str2 = "";
         let res = str1.concat(str2);
         document.getElementById("output").innerHTML += res;
      }
      test();
   </script>
</body>
</html>

输出

The resultant string after appending str2 to str1 is: Hi

您将在控制台中看到类似于以下屏幕截图的结果。要查看控制台结果,请在运行代码之前打开它。

调试断点输出

开发者实用技巧

您可以牢记以下技巧,以减少脚本中的错误数量并简化调试过程 -

  • 使用大量注释。注释可以帮助您解释编写脚本的原因,并解释代码中特别难懂的部分。

  • 始终使用缩进以使您的代码易于阅读。缩进语句还可以让您更轻松地匹配开始和结束标签、花括号以及其他 HTML 和脚本元素。您可以使用 IDE 中的代码格式化程序。

  • 编写模块化代码。尽可能将语句分组到函数中。函数允许您将相关语句分组,并以最少的工作量测试和重用部分代码。

  • 变量和函数的命名方式应保持一致。尝试使用足够长且有意义的名称,这些名称应能够描述变量的内容或函数的用途。

  • 命名变量和函数时应使用一致的语法。换句话说,保持它们全部小写或全部大写;如果您更喜欢驼峰表示法,请保持一致。

  • 以模块化方式测试长脚本。换句话说,在测试脚本的任何部分之前,不要尝试编写整个脚本。在添加下一部分代码之前,请先编写一段代码并使其运行。

  • 使用描述性的变量和函数名称,并避免使用单字符名称。

  • 注意引号。请记住,引号是成对使用的,并且两个引号的样式必须相同(单引号或双引号)。

  • 注意等号。不应使用单个 = 进行比较。

  • 使用 var 关键字显式声明变量。