JavaScript 常见错误
本章指出了一些常见的 JavaScript 错误。
意外使用赋值运算符
如果程序员意外地使用了赋值运算符(=
)而不是比较运算符(==
) 在 if 语句中。
这 if
语句返回false
(如预期)因为 x 不等于 10:
让 x = 0;
如果 (x == 10)
亲自尝试 »
这 if
语句返回true
(可能不像预期的那样),因为 10 是正确的:
让 x = 0;
如果(x = 10)
亲自尝试 »
这 if
语句返回false
(可能不像预期的那样),因为 0 为假:
让 x = 0;
如果(x = 0)
亲自尝试 »
赋值总是返回赋值的值。
期望宽松的比较
在常规比较中,数据类型并不重要。这 if
语句返回 true:
设 x = 10;
让 y = "10";
如果 (x == y)
亲自尝试 »
严格来说,数据类型很重要。这 if
语句返回 false:
设 x = 10;
让 y = "10";
如果 (x === y)
亲自尝试 »
一个常见的错误是忘记 switch
语句使用严格比较:
这 case switch
将显示一条警报:
设 x = 10;
开关(x){
情况10:alert(“你好”);
}
亲自尝试 »
这 case switch
不会显示警告:
设 x = 10;
开关(x){
案例“10”:警报(“你好”);
}
亲自尝试 »
令人困惑的加法和连接
添加 是关于添加数字.
级联 是关于添加字符串.
在 JavaScript 中,两种操作都使用相同的 +
操作员。
因此,将数字作为数字添加与将数字作为字符串添加会产生不同的结果:
设 x = 10;
x = 10 + 5; // 现在 x 是 15
令 y = 10;
y += "5"; // 现在 y 是 "105"
亲自尝试 »
当添加两个变量时,可能很难预测结果:
设 x = 10;
令 y = 5;
让 z = x + y; // 现在 z 是 15
设 x = 10;
让 y = "5";
让 z = x + y; // 现在 z 是“105”
亲自尝试 »
误解浮标
JavaScript 中的所有数字都以 64 位存储 浮点数字 (浮动)。
所有编程语言(包括 JavaScript)在处理精确浮点值时都存在困难:
设 x = 0.1;
令 y = 0.2;
让 z = x + y // z 中的结果不会是 0.3
亲自尝试 »
为了解决上述问题,乘法和除法很有用:
破坏 JavaScript 字符串
JavaScript 允许你将一个语句分成两行:
但是,在字符串中间中断语句是行不通的:
如果必须中断字符串中的语句,则必须使用“反斜杠”:
放错分号
由于分号位置错误,无论 x 的值是什么,此代码块都会执行:
如果 (x==19);
{
// 代码块
}
亲自尝试 »
打破退货声明
在行末自动关闭语句是 JavaScript 的默认行为。
因此,这两个示例将返回相同的结果:
JavaScript 还允许您将一个语句分成两行。
因此,示例 3 也将返回相同的结果:
但是,如果将返回语句分成两行,如下所示,会发生什么情况:
该函数将返回 undefined
!
为什么?因为 JavaScript 认为你的意思是:
解释
如果语句不完整,例如:
让
JavaScript 将尝试通过读取下一行来完成该语句:
功率=10;
但由于此语句已完成:
返回
JavaScript 将自动关闭它,如下所示:
返回;
发生这种情况的原因是,在 JavaScript 中用分号关闭(结束)语句是可选的。
JavaScript 会在行末关闭 return 语句,因为它是一个完整的语句。
切勿破坏返回语句。
使用命名索引访问数组
许多编程语言支持具有命名索引的数组。
具有命名索引的数组称为关联数组(或哈希)。
JavaScript 确实 不是 支持具有命名索引的数组。
在 JavaScript 中, 数组 使用编号索引:
例子
const 人 = [];
person[0] = "约翰";
人[1] = "Doe";
人[2] = 46;
person.length; // person.length 将返回 3
person[0]; // person[0] 将返回“John”
亲自尝试 »
在 JavaScript 中, 对象 使用命名索引.
如果使用命名索引,则在访问数组时,JavaScript 会将数组重新定义为标准对象。
自动重定义后,数组方法和属性将产生未定义或不正确的结果:
例子:
const 人 = [];
人["firstName"] = "约翰";
人["lastName"] = "Doe";
人["年龄"] = 46;
person.length; // person.length 将返回 0
person[0]; // person[0] 将返回未定义
亲自尝试 »
用逗号结束定义
在 ECMAScript 5 中,对象和数组定义中的尾随逗号是合法的。
对象示例:
人 = {名字:“John”,姓氏:“Doe”,年龄:46,}
数组示例:
点 = [40, 100, 1, 5, 25, 10,];
警告 !!
Internet Explorer 8 将会崩溃。
JSON 不允许使用尾随逗号。
JSON:
人 = {“firstName”:“John”,“lastName”:“Doe”,“年龄”:46}
JSON:
点=[40,100,1,5,25,10];
Undefined 不为空
JavaScript 对象、变量、属性和方法可以是 undefined
.
此外,空的 JavaScript 对象可以具有值 null
.
这使得测试对象是否为空变得有点困难。
您可以通过测试类型是否为来测试对象是否存在 undefined
:
但是你无法测试一个对象是否 null
,因为如果对象是 undefined
:
错误:
如果 (myObj === null)
为了解决这个问题,你必须测试一个对象是否 null
, 并不是 undefined
.
但这仍然会引发错误:
错误:
如果 (myObj !== null && typeof myObj !== “未定义”)
因此,你必须测试是否 undefined
在你测试之前null
: