Erros Comuns do JavaScript

Este capítulo aponta alguns erros comuns no JavaScript.

uso inesperado do operador de atribuição

Se o programador usar if A utilização inesperada do operador de atribuição (=)ao invés do operador de comparação (====),o programa JavaScript pode gerar alguns resultados inesperados.

essa if A sentença retorna falso(Como esperado),porque x não é igual a 10:

var x = 0;
if (x == 10) 

Experimente Você Mesmo

essa if A sentença retorna verdadeiro(Talvez não seja como esperado),porque 10 é verdadeiro:

var x = 0;
if (x = 10) 

Experimente Você Mesmo

essa if A sentença retorna falso(Talvez não seja como esperado),porque 0 é falso:

var x = 0;
if (x = 0) 

Experimente Você Mesmo

A atribuição sempre retorna o valor atribuído.

esperando comparação solta

Na comparação usual, o tipo de dados não importa. Essa if A sentença retorna verdadeiro

var x = 10;
var y = "10";
if (x == y) 

Experimente Você Mesmo

Na comparação estrita, o tipo de dados realmente importa. Essa if A sentença retorna falso

var x = 10;
var y = "10";
if (x === y) 

Experimente Você Mesmo

Um erro comum é esquecer de usar switch A sentença usa comparação estrita:

essa switch A sentença mostrará a caixa de diálogo:

var x = 10;
switch(x) {
    case 10: alert("Hello");
}

Experimente Você Mesmo

essa switch A sentença não mostrará a caixa de diálogo:

var x = 10;
switch(x) {
    case "10": alert("Hello");
}

Experimente Você Mesmo

Adição e Concatenação confusas

AdiçãoPara adiçãoNumérico.

Cadeia (Concatenação)Para adiçãoCadeia.

No JavaScript, ambos os operadores usam o mesmo + Operadores.

Por isso, somar números como valores numéricos e como strings resultará em resultados diferentes:

var x = 10 + 5;          // O resultado em x é 15
var x = 10 + "5";         // O resultado em x é "105"

Experimente Você Mesmo

Se duas variáveis forem somadas, é difícil prever o resultado:

var x = 10;
var y = 5;
var z = x + y;            // O resultado em z é 15
var x = 10;
var y = "5";
var z = x + y;            // O resultado em z é "105"

Experimente Você Mesmo

Flutuante enganoso

Os números em JavaScript são salvos como 64 bitsNúmeros de ponto flutuante (Floats).

Todos os linguagens de programação, incluindo o JavaScript, enfrentam dificuldades no tratamento de valores de ponto flutuante:

var x = 0.1;
var y = 0.2;
var z = x + y             // o resultado em z não será 0.3

Experimente Você Mesmo

Para resolver o problema acima, use operações de multiplicação e divisão:

Exemplo

var z = (x * 10 + y * 10) / 10;       // o resultado em z será 0.3

Experimente Você Mesmo

Quebrar a string do JavaScript

O JavaScript permite que você quebre uma sentença em duas linhas:

Exemplo 1

var x =
"Hello World!";

Experimente Você Mesmo

Mas, quebrar a linha no meio da string não é correto:

Exemplo 2

var x = "Hello
World!";

Experimente Você Mesmo

Se for necessário quebrar uma string na linha, deve-se usar a barra invertida:

Exemplo 3

var x = "Hello \
World!";

Experimente Você Mesmo

Ponto-virgula deslocado

Devido a um ponto-virgula incorreto, este bloco de código sempre será executado, independentemente do valor de x:

if (x == 19);
{
     // bloco de código
}

Experimente Você Mesmo

Quebrar a sentença return

Fechar automaticamente a sentença no final da linha é o comportamento padrão do JavaScript.

Portanto, os dois exemplos a seguir retornarão o mesmo resultado:

Exemplo 1

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

Experimente Você Mesmo

Exemplo 2

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

Experimente Você Mesmo

O JavaScript também permite que você quebre uma sentença em duas linhas.

Por isso, o exemplo 3 também retornará o mesmo resultado:

Exemplo 3

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

Experimente Você Mesmo

Mas, se você usar return O que acontece se a sentença for quebrada em duas linhas?

Exemplo 4

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

Experimente Você Mesmo

Esta função retornará undefined!

Porque? Porque o JavaScript entende que você quer:

Exemplo 5

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

Experimente Você Mesmo

Explicação

Se uma sentença não estiver completa:

var

O JavaScript completará esta sentença lendo a próxima linha:

power = 10;

Mas, porque esta sentença é completa:

return

O JavaScript fecha automaticamente a sentença:

return;

A razão para isso é que, no JavaScript, o uso de pontos-virgula para fechar (encerrar) a sentença é opcional.

O JavaScript fecha a linha no final return A sentença, pois ela já é uma sentença completa.

Portanto, nunca faça isso return A sentença é quebrada na linha.

Acessar arrays através de índices nomeados

很多编程语言支持带有命名索引的数组。

带有命名索引的数组被称为关联数组(或散列)。

JavaScript 不支持带有命名索引的数组。

在 JavaScript 中,数组使用数字索引

Exemplo

var person = [];
person[0] = "Bill";
person[1] = "Gates";
person[2] = 46;
var x = person.length;          // person.length 将返回 3
var y = person[0];              // person[0] 将返回 "Bill"

Experimente Você Mesmo

在 JavaScript 中,对象使用命名索引.

如果您使用命名索引,那么在访问数组时,JavaScript 会将数组重新定义为标准对象。

在自动重定义之后,数组方法或属性将产生未定义或非正确的结果:

Exemplo

var person = [];
person["firstName"] = "Bill";
person["lastName"] = "Gates";
person["age"] = 46;
var x = person.length;         // person.length 将返回 0
var y = person[0];              // person[0] 将返回 undefined

Experimente Você Mesmo

用逗号来结束定义

对象和数组定义中的尾随逗号在 ECMAScript 5 中是合法的。

对象实例:

person = {firstName:"Bill", lastName:"Gates", age:62,}

数组实例:

points = [35, 450, 2, 7, 30, 16,];

警告!!

Internet Explorer 8 会崩溃。

JSON 不允许尾随逗号。

JSON:

person = {firstName:"Bill", lastName:"Gates", age:62}

JSON:

points = [35, 450, 2, 7, 30, 16];

Undefined 不是 Null

JavaScript 对象、变量、属性和方法可以是未定义的。

此外,空的 JavaScript 对象的值可以为 null.

这可能会使测试对象是否为空变得有点困难。

您可以通过测试类型是否为 undefined,来测试对象是否存在:

Exemplo

if (typeof myObj === "undefined")

Experimente Você Mesmo

mas você não pode testar se o objeto é nullporque se o objeto não for definido, será lançado um erro:

Incorreto:

if (myObj === null)

Para resolver este problema, deve-se testar se o objeto é nullem vez de undefined.

mas ainda assim causará erro:

Incorreto:

if (myObj !== null && typeof myObj !== "undefined")

Portanto, antes de testar se não é null, deve-se testar se é undefined:

Correto:

if (typeof myObj !== "undefined" && myObj !== null)

Experimente Você Mesmo

espera um escopo de bloco

JavaScript nãocria um novo escopo para cada bloco de código.

Muitas linguagens de programação são assim, mas o JavaScript Não é assim.

pensar que este código retornará undefinedé um erro comum de novos desenvolvedores JavaScript:

Exemplo

for (var i = 0; i < 10; i++) {
  // Bloco de Código
}
return i;

Experimente Você Mesmo