Erros Comuns do JavaScript
- Página Anterior Práticas de Melhor JS
- Próxima Página Desempenho JS
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)
essa if
A sentença retorna verdadeiro
(Talvez não seja como esperado),porque 10 é verdadeiro:
var x = 0; if (x = 10)
essa if
A sentença retorna falso
(Talvez não seja como esperado),porque 0 é falso:
var x = 0; if (x = 0)
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)
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)
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"); }
essa switch
A sentença não mostrará a caixa de diálogo:
var x = 10; switch(x) { case "10": alert("Hello"); }
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"
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"
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
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
Quebrar a string do JavaScript
O JavaScript permite que você quebre uma sentença em duas linhas:
Exemplo 1
var x = "Hello World!";
Mas, quebrar a linha no meio da string não é correto:
Exemplo 2
var x = "Hello World!";
Se for necessário quebrar uma string na linha, deve-se usar a barra invertida:
Exemplo 3
var x = "Hello \ World!";
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 }
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 }
Exemplo 2
function myFunction(a) { var power = 10; return a * power; }
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; }
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; }
Esta função retornará undefined
!
Porque? Porque o JavaScript entende que você quer:
Exemplo 5
function myFunction(a) { var power = 10; return; a * power; }
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"
在 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
用逗号来结束定义
对象和数组定义中的尾随逗号在 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")
mas você não pode testar se o objeto é null
porque 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 é null
em 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)
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;
- Página Anterior Práticas de Melhor JS
- Próxima Página Desempenho JS