最新的Web开发教程
 

JavaScript常见错误


本章指出了一些常见的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
试一试»

为了解决上述问题,它有助于乘除:

var z = (x * 10 + y * 10) / 10;       // z will be 0.3
试一试»

打破一个JavaScript字符串

JavaScript的将让你打破语句转换成两行:

例1

var x =
"Hello World!";
试一试»

但是,在一个字符串中间破声明将无法工作:

例2

var x = "Hello
World!";
试一试»

您必须使用“反斜杠”如果你必须打破字符串中的语句:

例3

var x = "Hello \
World!";
试一试»

乱放分号

因为放错位置的分号,这个代码块将不分执行x的值:

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

打破一个return语句

这是一个默认的JavaScript行为在一行结束时自动关闭的声明。

正因为如此,这两个例子将返回相同的结果:

例1

function myFunction(a) {
    var power = 10 
    return a * power
}
试一试»

例2

function myFunction(a) {
    var power = 10;
    return a * power;
}
试一试»

JavaScript的也将让你打破一个语句转换成两行。

正因为如此,实施例3也将返回相同的结果:

例3

function myFunction(a) {
    var
    power = 10; 
    return a * power;
}
试一试»

但是,如果你打破return语句在两行这样会发生什么:

例4

function myFunction(a) {
    var
    power = 10; 
    return
    a * power;
}
试一试»

该函数将返回不确定的!

为什么? 因为JavaScript认为你的意思是:

例5

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 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:

for (var i = 0; i < 10; i++) {
    // some code
}
return i;
试一试»