整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JS|7种JavaScript代码调试的方法

S是解释型语言,是逐条语句解释执行的,如果错误发生在某个语句块,此语句块以前的语句一般都可以正常执行。这不同于C等编译型语言。

代码调试的重点在于找到错误发生点,然后才能有的放矢。

1 alert()

通常可以使用警告框来提示变量信息。

alert(document.body.innerHTML);

当警告框弹出时,用户将需要单击“确定”来继续。

2 html标签内使用document.write()

<div id="demo">
    <script>
        var arr=[1,2,3,4,5]
        document.write(arr[2] + ' ') //3
    </script>
</div>

需要注意的是是,以下写法会替换整个页面的内容:

<button type="button" onclick="document.write(5 + 6)">试一试</button>

即使是函数调用也是如此。

3 innerHTML()

document.getElementById("demo").innerHTML =""

<h1>JavaScript Array.filter()</h1>

<p>使用通过测试的所有数组元素创建一个新数组。</p>

<p id="demo"></p> //45,25

<script>
    var numbers = [45, 4, 9, 16, 25];
    var over18 = numbers.filter(myFunction);

    document.getElementById("demo").innerHTML = over18;

    function myFunction(value, index, array) {
        return value > 18;
}
</script>

4 console()

JS的运行环境是浏览器,由浏览器引擎解释执行JS代码,一般来说,浏览器也提供调试器,如chrome按F12即可调出高试器:

<!DOCTYPE html>
<html>
<body>
<h4>我的第一张网页</h4>
<p>使用F12在浏览器(Chrome、IE、Firefox)中激活调试,然后在调试器菜单中选择“控制台”。</p>
    <script>
        a = 5;
        b = 6;
        c = a + b;
        console.log(c);
    </script>
</body>
</html>

如果您的浏览器支持调试,那么您可以使用 console.log() 在调试窗口中显示 JavaScript 的值:

内置的调试器可打开或关闭,强制将错误报告给用户。

通过调试器,您也可以设置断点(代码执行被中断的位置),并在代码执行时检查变量。

5 try catch捕获错误

<p id="demo"></p>

<script>
try {
  adddlert("欢迎您,亲爱的用户!");
}
catch(err) {
  demo.innerHTML = err.message; //adddlert is not defined
}
</script>

JavaScript 实际上会创建带有两个属性的 Error 对象:name 和 message。

name 设置或返回错误名。

message 设置或返回错误消息(一条字符串)。

6 debugger

debugger停止执行 JavaScript,并调用调试函数(如果可用)。

7 注释法或增量法

可以注释掉一些可疑代码来确定错误发生点。

或者考虑逐步增加代码的方法,逐步验证,以避免错误。

8 一些常见的 JavaScript 错误。

8.1 意外使用赋值运算符

如果程序员在 if 语句中意外使用赋值运算符(=)而不是比较运算符(===),JavaScript 程序可能会产生一些无法预料的结果。

8.2 令人困惑的加法和级联

加法用于加数值。

级联(Concatenation)用于加字符串。

在 JavaScript 中,这两种运算均使用相同的 + 运算符。

正因如此,将数字作为数值相加,与将数字作为字符串相加,将产生不同的结果:

var x = 10 + 5;          // x 中的结果是 15
var x = 10 + "5";         // x 中的结果是 "105"

而加法以外的其它算法运算符可以将字符串进行自动类型转换。

10-"5" // 5

8.3 令人误解的浮点数

JavaScript 中的数字均保存为 64 位的浮点数(Floats),符合IEEE754的标准。

所有编程语言,包括 JavaScript,都存在处理浮点值的困难:

var x = 0.1;
var y = 0.2;
var z = x + y             // z=0.30000000000000004

8.4 错位的分号

因为一个错误的分号,此代码块无论 x 的值如何都会执行:

if (x == 19);
{
     // code block
}

在一行的结尾自动关闭语句是默认的 JavaScript 行为。

在 JavaScript 中,用分号来关闭(结束)语句是可选的。

8.5 对象使用命名索引

在 JavaScript 中,数组使用数字索引。

在 JavaScript 中,对象使用命名索引。

如果您使用命名索引,那么在访问数组时,JavaScript 会将数组重新定义为标准对象。

<p id="demo"></p>

<script>
var person = [];
person["firstName"] = "Bill";
person["lastName"] = "Gates";
person["age"] = 46;
var x = person.length;         // person.length 将返回 0
var y = person[0];              // person[0] 将返回 undefined
y=person["age"]; //ok
y=person.age;//ok
document.getElementById("demo").innerHTML = y
</script>

8.6 Undefined 不是 Null

Undefined 的类型是 Undefined,Null的类型是Object。

JavaScript 对象、变量、属性和方法可以是未定义的。

此外,空的 JavaScript 对象的值可以为 null。

在测试非 null 之前,必须先测试未定义:

if (typeof myObj !== "undefined" && myObj !== null)

8.7 JS没有块作用域(与C语言不同)

在 ES2015 之前,JavaScript 只有两种类型的作用域:全局作用域和函数作用域。

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript</h2>

<p>JavaScript不会为每个代码块创建新的作用域。</p>

<p>此代码将显示 i(10)的值,即使在 for 循环块之外:</p>

<p id="demo"></p>

<script>
for (var i = 0; i < 10; i++) {
  // some code
}
document.getElementById("demo").innerHTML = i; //10
</script>

</body>
</html>

ES2015 引入了两个重要的 JavaScript 新关键词:let 和 const。

这两个关键字在 JavaScript 中提供了块作用域(Block Scope)变量(和常量)。

for (let i = 0; i < 10; i++) {

  // some code

}

document.getElementById("demo").innerHTML = i; //不能访问

-End-

在编写 JavaScript 时,如果没有调试工具将是一件很痛苦的事情。

JavaScript 调试

没有调试工具是很难去编写 JavaScript 程序的。

你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现。

通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置。

通常,你在编写一个新的 JavaScript 代码过程中都会发生错误。

JavaScript 调试工具

在程序代码中寻找错误叫做代码调试。

调试很难,但幸运的是,很多浏览器都内置了调试工具。

内置的调试工具可以开始或关闭,严重的错误信息会发送给用户。

有了调试工具,我们就可以设置断点 (代码停止执行的位置), 且可以在代码执行时检测变量。

浏览器启用调试工具一般是按下 F12 键,并在调试菜单中选择 "Console" 。

console.log() 方法

如果浏览器支持调试,你可以使用 console.log() 方法在调试窗口上打印 JavaScript 值:

实例

<!DOCTYPE html>

<html>

<body>

<h1>My First Web Page</h1>

<script>

a = 5;

b = 6;

c = a + b;

console.log(c);

</script>

</body>

</html>

设置断点

在调试窗口中,你可以设置 JavaScript 代码的断点。

在每个断点上,都会停止执行 JavaScript 代码,以便于我们检查 JavaScript 变量的值。

在检查完毕后,可以重新执行代码(如播放按钮)。

debugger 关键字

debugger 关键字用于停止执行 JavaScript,并调用调试函数。

这个关键字与在调试工具中设置断点的效果是一样的。

如果没有调试可用,debugger 语句将无法工作。

开启 debugger ,代码在第三行前停止执行。

实例

var x = 15 * 5;

debugger;

document.getElementbyId("demo").innerHTML = x;

主要浏览器的调试工具

通常,浏览器启用调试工具一般是按下 F12 键,并在调试菜单中选择 "Console" 。

各浏览器的步骤如下:

Chrome 浏览器

  • 打开浏览器。

  • 在菜单中选择工具。

  • 在工具中选择开发者工具。

  • 最后,选择 Console。

Firefox 浏览器

  • 打开浏览器。

  • 访问页面:

    http://www.getfirebug.com。

  • 按照说明 :

    安装 Firebug。

Internet Explorer 浏览器。

  • 打开浏览器。

  • 在菜单中选择工具。

  • 在工具中选择开发者工具。

  • 最后,选择 Console。

Opera

  • 打开浏览器。

  • Opera 的内置调试工具为 Dragonfly,详细说明可访问页面:

    http://www.opera.com/dragonfly/。

Safari

  • 打开浏览器。

  • 右击鼠标,选择检查元素。

  • 在底部弹出的窗口中选择"控制台"。

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

JavaScript中调试任何内容的最简单方法之一是使用日志记录console.log。但是控制台提供了许多其他方法可以帮助您更好地进行调试。

开始

先看一个简单的示例,我们经常会使用打印一个对象的方式来调试这个对象的值,如下

<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 <meta http-equiv="X-UA-Compatible" content="ie=edge" />
 <title>JS</title>
 </head>
 <body>
 <script>
 const foo = { id: 1, verified: true, color: "蓝色" };
 const bar = { id: 2, verified: false, color: "红色" };
 console.log(foo);
 console.log(bar);
 </script>
 </body>
</html>

这段代码我们在进入页面后,打印了两个对象,这样有一个很明显的问题就是我们并不知道变量名,当然,你也可以在打印的时候带上变量名,就像这样

<script>
 const foo = { id: 1, verified: true, color: "蓝色" };
 const bar = { id: 2, verified: false, color: "红色" };
 console.log("foo", foo);
 console.log("bar", bar);
 console.log({ foo, bar });
</script>

这两种方式都可以,要么自己打印出来,要么组合成一个对象,而且大多数情况下我们也有可能就是这么干的,看下控制台

缺点就是我们需要展开对象才能看到对象属性的值。

console.table()

除了console.log()我们还可以使用console.table(),我们来尝试下

 <script>
 const foo = { id: 1, verified: true, color: "蓝色" };
 const bar = { id: 2, verified: false, color: "红色" };
 console.table({ foo, bar });
 </script>

浏览器截图如图,控制台输出了一个表格和一个组合对象,这样要比单纯的console.log()直观的多

console.group()

如果你想要将相关详细信息分组或嵌套在一起或者在函数中包含一些日志语句并且希望能够清楚地看到与每个语句对应的范围时,可以使用console.group(),示例代码如下

<script>
 console.group("用户详情:");
 console.log("姓名: 孙悟空");
 console.log("职业: 软件开发工程师");
 console.group("住址");
 console.log("街道: 123 大唐路");
 console.log("城市: 大唐");
 console.groupEnd();
</script>

浏览器截图如下

相当的直观,虽然这样的场景可能我们遇到的并不多,如果你想默认折叠这段信息,你可以使用groupCollapsed替代group。

console.warn()和console.error()

根据具体情况,为了确保控制台更具可读性,可以使用console.warn()或console.error() 添加日志。console.info()在某些浏览器中还会显示“i”图标;

 <script>
 console.error("这是一error");
 console.warn("这是一个warn");
 console.info("这是一个info");
</script>

设置可以添加自定义样式更进一步。可以使用%c指令将样式添加到任何日志语句。这可以通过保持约定来区分API调用,用户事件等。下面是一个例子:

<script>
 console.log(
 "%c Auth ",
 "color: white; background-color: #2274A5",
 "登录也渲染了"
 );
 console.log(
 "%c GraphQL ",
 "color: white; background-color: #95B46A",
 "获取用户详情"
 );
 console.log(
 "%c Error ",
 "color: white; background-color: #D33F49",
 "获取用户信息出错"
 );
 </script>

console.trace()

调试JavaScript程序时,有时需要打印函数调用的栈信息,这可以通过使用console.trace()来实现,示例如下:

<script>
 function doTask() {
 doSubTask(1000, 10000);
 }
 function doSubTask(countX, countY) {
 for (var i = 0; i < countX; i++) {
 for (var j = 0; j < countY; j++) {}
 }
 console.trace();
 }
 doTask();
 </script>

console.time()

如同其他语言的一些定时函数,我们可以使用console.time()来监视一段代码执行的时间

<script>
 let i = 0;
 console.time("While");
 while (i < 1000000) {
 i++;
 }
 console.timeEnd("While");
 console.time("For");
 for (i = 0; i < 1000000; i++) {
 // For Loop
 }
 console.timeEnd("For");
</script>

总结一下

本文总结了一些在Web开发中常用的调试技巧,能让我们在开发时如鱼得水,希望对你有所帮助!