JavaScript 常见错误
本章将指出一些常见的 JavaScript 错误。
意外使用赋值运算符
如果程序员在 if 语句中意外地使用了赋值运算符(=
),而不是比较运算符(==
),JavaScript 程序可能会产生意想不到的结果。
此 if 语句返回 false
(符合预期),因为 x 不等于 10
let x = 0;
if (x == 10)
自己动手试一试 »
此 if 语句返回 true
(可能不是预期的),因为 10 为 true
let x = 0;
if (x = 10)
自己动手试一试 »
此 if 语句返回 false
(可能不是预期的),因为 0 为 false
let x = 0;
if (x = 0)
自己动手试一试 »
赋值运算总是返回赋值的值。
期望松散比较
在常规比较中,数据类型无关紧要。此 if 语句返回 true
let x = 10;
let y = "10";
if (x == y)
自己动手试一试 »
在严格比较中,数据类型很重要。此 if 语句返回 false
let x = 10;
let y = "10";
if (x === y)
自己动手试一试 »
忘记 switch 语句使用严格比较是一个常见错误。
此 case switch
将显示一个警报
let x = 10;
switch(x) {
case 10: alert("Hello");
}
自己动手试一试 »
此 case switch
将不会显示警报
let x = 10;
switch(x) {
case "10": alert("Hello");
}
自己动手试一试 »
混淆加法与连接
加法是关于数字的相加。
连接是关于字符串的相加。
在 JavaScript 中,这两种操作都使用相同的 +
运算符。
因此,将数字作为数字相加与将数字作为字符串相加会产生不同的结果。
let x = 10;
x = 10 + 5; // 现在 x 是 15
let y = 10;
y += "5"; // 现在 y 是 "105"
自己动手试一试 »
当相加两个变量时,很难预测结果。
let x = 10;
let y = 5;
let z = x + y; // 现在 z 是 15
let x = 10;
let y = "5";
let z = x + y; // 现在 z 是 "105"
自己动手试一试 »
误解浮点数
JavaScript 中的所有数字都存储为 64 位浮点数(Floats)。
所有编程语言,包括 JavaScript,在处理精确的浮点值时都有困难。
let x = 0.1;
let y = 0.2;
let z = x + y // z 中的结果不是 0.3
自己动手试一试 »
为了解决上述问题,乘除法会有帮助。
拆分 JavaScript 字符串
JavaScript 允许您将语句拆分成两行。
但是,在字符串中间拆分语句将不起作用。
如果您必须在字符串中拆分语句,则必须使用“反斜杠”。
错放分号
由于错放了分号,此代码块将执行,无论 x 的值是什么。
if (x == 19);
{
// 代码块
}
自己动手试一试 »
拆分 return 语句
JavaScript 的默认行为是在行尾自动关闭语句。
因此,这两个示例将返回相同的结果。
JavaScript 还允许您将语句拆分成两行。
因此,示例 3 也将返回相同的结果。
但是,如果您像这样将 return 语句拆分成两行,会发生什么?
函数将返回 undefined
!
为什么?因为 JavaScript 认为您的意思是
Explanation
如果一个语句不完整,就像
let
JavaScript 将尝试通过读取下一行来完成语句。
power = 10;
但是,由于这个语句是完整的,
return
JavaScript 将自动将其关闭,如下所示:
return;
这是因为在 JavaScript 中,使用分号结束(终止)语句是可选的。
JavaScript 将在行尾关闭 return 语句,因为它是一个完整的语句。
切勿拆分 return 语句。
使用命名索引访问数组
许多编程语言支持带命名索引的数组。
带命名索引的数组称为关联数组(或哈希)。
JavaScript不支持带命名索引的数组。
在 JavaScript 中,数组使用数字索引:
示例
const person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
person.length; // person.length 将返回 3
person[0]; // person[0] 将返回 "John"
自己动手试一试 »
在 JavaScript 中,对象使用命名索引。
如果您在访问数组时使用命名索引,JavaScript 会将数组重新定义为标准对象。
自动重新定义后,数组方法和属性将产生未定义或不正确的结果。
示例
const person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
person.length; // person.length 将返回 0
person[0]; // person[0] 将返回 undefined
自己动手试一试 »
在定义末尾添加逗号
在 ECMAScript 5 中,对象和数组定义中的尾随逗号是合法的。
对象示例
person = {firstName:"John", lastName:"Doe", age:46,}
数组示例
points = [40, 100, 1, 5, 25, 10,];
警告!!
Internet Explorer 8 将崩溃。
JSON 不允许尾随逗号。
JSON
person = {"firstName":"John", "lastName":"Doe", "age":46}
JSON
points = [40, 100, 1, 5, 25, 10];
Undefined 不等于 Null
JavaScript 对象、变量、属性和方法可以是 undefined
。
此外,空的 JavaScript 对象可能具有 null
值。
这使得测试对象是否为空有点困难。
您可以通过测试其类型是否为 undefined
来测试对象是否存在。
但是您不能测试对象是否为 null
,因为如果对象是 undefined
,这将引发错误。
不正确
if (myObj === null)
要解决此问题,您必须测试对象是否不为 null
且不为 undefined
。
但这仍然可能引发错误。
不正确
if (myObj !== null && typeof myObj !== "undefined")
因此,您必须先测试 undefined
,然后才能测试 null
。