JavaScript 常见错误
-
-
期待宽松的比较
在常规比较中,数据类型无关紧要。该if语句返回true:
尝试一下var x = 10; var y = "10"; if (x == y)
在严格的比较中,数据类型很重要。该if语句返回false:
尝试一下var x = 10; var y = "10"; if (x === y)
忘记switch语句使用严格比较是一个常见的错误:这case switch将显示警告:
尝试一下var x = 10; switch(x) { case 10: alert("Hello"); }
这case switch不会显示警告:
尝试一下var x = 10; switch(x) { case "10": alert("Hello"); }
-
-
-
-
-
截断return语句
在行尾自动关闭语句是一种默认的JavaScript行为。因此,这两个示例将返回相同的结果:
尝试一下function myFunction(a) { var power = 10 return a * power }
尝试一下function myFunction(a) { var power = 10; return a * power; }
JavaScript还允许您将语句分成两行。因此,示例3也会返回相同的结果:
尝试一下function myFunction(a) { var power = 10; return a * power; }
但是,如果你将return语句分成两行,会发生什么:
尝试一下function myFunction(a) { var power = 10; return a * power; }
该功能将返回undefined!为什么?因为JavaScript认为你的意思是:
尝试一下function myFunction(a) { var power = 10; return; a * power; }
说明:
如果声明不完整,如:var
JavaScript将尝试通过阅读下一行来完成该语句:power = 10;
由于此声明已完成:return
JavaScript会自动关闭它,如下所示:return;
这是因为在JavaScript中使用分号结束(结束)语句是可选的。JavaScript将关闭行尾的return语句,因为它是一个完整的语句。永远不要尝试断开return语句
-
访问具有命名索引的数组
许多编程语言支持具有命名索引的数组。具有命名索引的数组称为关联数组(或哈希)。JavaScript并没有支持数组名为索引。在JavaScript中,数组使用编号索引:
尝试一下var person = []; person[0] = "John"; person[1] = "Doe"; person[2] = 46; var x = person.length; // person.length 返回 3 var y = person[0]; // person[0] 返回 "John"
用逗号结束定义
对象和数组定义中的尾随逗号在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} points = [40, 100, 1, 5, 25, 10];
-
未定义不是空的
JavaScript对象,变量,属性和方法都可以undefined。此外,空JavaScript对象可以具有该值null。这可能会使测试对象是否为空有点困难。您可以通过测试类型是否undefined:
尝试一下if (typeof myObj === "undefined")
但是你无法测试一个对象是否是null,因为如果对象是这样会抛出undefined错误:if (myObj === null)
要解决此问题,您必须测试对象是否null不是undefined。但这仍然会引发错误:if (myObj !== null && typeof myObj !== "undefined")
因此,在测试null之前必须先进行测试undefined:
尝试一下if (typeof myObj !== "undefined" && myObj !== null)
-
期待块级作用域
JavaScript 不会为每个代码块创建新的作用域。在许多编程语言中都是如此,但在JavaScript中却不是这样。此代码将显示i(10)的值,甚至是for循环块的外面:
尝试一下for (var i = 0; i < 10; i++) { // some code } return i;