本章指出了一些常见的JavaScript错误。
无意中使用赋值运算符
JavaScript程序可能会产生意外的结果,如果程序员不小心使用了赋值运算符(=)而不是比较操作符(==)在if语句。
这if语句返回false (如预期),因为x不等于10:
var x = 0;
if (x == 10)
试一试» 这if语句返回true (也许并不如预期),因为10是真的:
var x = 0;
if (x = 10)
试一试» 这if语句返回false (也许并不如预期),因为0是假的:
var x = 0;
if (x = 0)
试一试» 赋值总是返回分配的值。
期待比较宽松
在定期的比较,数据类型并不重要。 这if语句返回true :
var x = 10;
var y = "10";
if (x == y)
试一试» 在严格的比较,数据类型此事呢。 这if语句返回false :
var x = 10;
var y = "10";
if (x === y)
试一试» 这是一个常见的错误是忘记switch语句中使用严格的比较:
这种情况下,交换机将显示一个警告:
var x = 10;
switch(x) {
case 10: alert("Hello");
}
试一试» 这种情况下,交换机将不会显示一个警告:
var x = 10;
switch(x) {
case "10": alert("Hello");
}
试一试» 令人困惑的加法和串联
另外是关于添加数字 。
级联是有关添加字符串 。
在JavaScript这两种操作使用相同+运营商。
由于这个原因,添加数作为数将从加入了许多作为字符串产生不同的结果:
var x = 10 + 5; //
the result in x is 15
var x = 10 + "5";
// the result in x is "105"
试一试» 当添加两个变量,也可以是难以预料的结果:
var x = 10;
var y = 5;
var z = x + y;
// the result in z is 15
var x = 10;
var y = "5";
var z =
x + y;
// the result in z is "105"
试一试» 误区花车
在JavaScript中的所有数字都存储为64位浮点数 (浮点)。
所有的编程语言,包括JavaScript,有精确的浮点值的困难:
var x = 0.1;
var y = 0.2;
var z = x + y
// the result in z will not be 0.3
if (z == 0.3)
// this if test will fail
试一试» 为了解决上述问题,它有助于乘除:
打破一个JavaScript字符串
JavaScript的将让你打破语句转换成两行:
但是,在一个字符串中间破声明将无法工作:
您必须使用“反斜杠”如果你必须打破字符串中的语句:
乱放分号
因为放错位置的分号,这个代码块将不分执行x的值:
if (x == 19);
{
// code block
}
试一试» 打破一个return语句
这是一个默认的JavaScript行为在一行结束时自动关闭的声明。
正因为如此,这两个例子将返回相同的结果:
JavaScript的也将让你打破一个语句转换成两行。
正因为如此,实施例3也将返回相同的结果:
但是,如果你打破return语句在两行这样会发生什么:
该函数将返回不确定的!
为什么? 因为JavaScript认为你的意思是:
说明
如果语句是不完整的,如:
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 will return 3
var y = person[0];
// person[0] will return "John"
试一试» 在JavaScript中, 对象使用命名的索引 。
如果你使用了一个名为索引访问数组时的JavaScript将重新定义数组一个标准的对象。
自动重新定义后,阵列方法和属性会产生不确定的或不正确的结果:
例:
var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length; // person.length will
return 0
var y = person[0];
// person[0] will return undefined
试一试» 结束与一个逗号的数组定义
不正确:
points = [40, 100, 1, 5, 25, 10,];
一些JSON和JavaScript引擎将失败或意外行为。
正确:
points = [40, 100, 1, 5, 25, 10];
结束与一个逗号的对象定义
不正确:
person = {firstName:"John", lastName:"Doe", age:46,}
一些JSON和JavaScript引擎将失败或意外行为。
正确:
person = {firstName:"John", lastName:"Doe", age:46}
未定义不为空
使用JavaScript,是空的对象,undefined是变量,属性和方法。
为NULL,对象必须定义,否则将是不确定的。
如果你想测试一个对象是否存在,如果对象是不确定的,这将引发错误:
不正确:
if (myObj !== null && typeof myObj !== "undefined")
正因为如此,你必须首先测试的typeof():
正确:
if (typeof myObj !== "undefined" && myObj !== null)
期待块级范围
JavaScript 不为每个代码块新的作用域。
它是在许多编程语言真实的,但不是在JavaScript的真 。
这是一个常见的错误,其中新的JavaScript开发者,相信这段代码返回undefined: