Este capítulo destaca alguns erros comuns de JavaScript.
Acidentalmente Usando o operador de atribuição
Programas JavaScript pode gerar resultados inesperados se um programador usa acidentalmente um operador de atribuição (=) , em vez de um operador de comparação (==) em uma instrução if.
Isso if instrução retorna false (como esperado), porque x não é igual a 10:
var x = 0;
if (x == 10)
Tente você mesmo " Isso if instrução retorna true (talvez não tão esperado), porque 10 é verdadeira:
var x = 0;
if (x = 10)
Tente você mesmo " Isso if instrução retorna false (talvez não tão esperado), porque 0 é falsa:
var x = 0;
if (x = 0)
Tente você mesmo " Uma atribuição sempre retorna o valor da atribuição.
Esperando Comparação solto
Em comparação regular, tipo de dados não importa. Esta declaração se retorna true :
var x = 10;
var y = "10";
if (x == y)
Tente você mesmo " Em comparação rigorosa, tipo de dados não importa. Esta declaração se retorna false :
var x = 10;
var y = "10";
if (x === y)
Tente você mesmo " É um erro comum esquecer que declarações switch usar comparação estrita:
Esta chave caso exibirá um alerta:
var x = 10;
switch(x) {
case 10: alert("Hello");
}
Tente você mesmo " Esta chave caso não exibirá um alerta:
var x = 10;
switch(x) {
case "10": alert("Hello");
}
Tente você mesmo " Confuso Adição & concatenação
Além é sobre a adição de números.
Concatenação é sobre a adição de cordas.
Em JavaScript ambas as operações usam o mesmo operador +.
Devido a isso, a adição de um número como um número irá produzir um resultado diferente da adição de um número como uma cadeia:
var x = 10 + 5; //
the result in x is 15
var x = 10 + "5";
// the result in x is "105"
Tente você mesmo " Quando a adição de duas variáveis, pode ser difícil de prever o resultado:
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"
Tente você mesmo " Incompreensão flutuadores
Todos os números em JavaScript são armazenados como 64-bits números de ponto flutuante (flutua).
Todas as linguagens de programação, incluindo JavaScript, têm dificuldades com valores de ponto flutuante precisas:
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
Tente você mesmo " Para resolver o problema acima, ele ajuda a multiplicar-se e dividir:
Quebrando uma String JavaScript
JavaScript permitirá que você quebrar uma declaração em duas linhas:
Mas, quebrando uma instrução no meio de uma corda não vai funcionar:
Você deve usar uma "barra invertida" se você deve quebrar a declaração em uma string:
extravio Semicolon
Por causa de um ponto e vírgula deslocada, este bloco de código será executado independentemente do valor de x:
if (x == 19);
{
// code block
}
Tente você mesmo " Quebrando uma instrução de retorno
É um comportamento do JavaScript padrão para fechar automaticamente uma instrução no final de uma linha.
Devido a isso, estes dois exemplos irá devolver o mesmo resultado:
JavaScript também permitirá que você quebrar uma declaração em duas linhas.
Devido a isto, o exemplo 3, também irá devolver o mesmo resultado:
Mas, o que vai acontecer se você quebrar a instrução de retorno em duas linhas como este:
A função retornará indefinido!
Por quê? Porque JavaScript pensa que você queria dizer:
Explicação
Se uma declaração estiver incompleta, como:
var
JavaScript vai tentar completar a instrução, lendo a linha seguinte:
power = 10;
Mas desde que esta declaração é completa:
return
JavaScript irá fechá-lo automaticamente assim:
return;
Isso acontece porque fechamento (fim) declarações com ponto e vírgula é opcional em JavaScript.
JavaScript irá fechar a instrução de retorno no final da linha, pois é uma instrução completa.
Nunca quebrar uma instrução de retorno.
Acesso às matrizes com índices nomeados
Muitas linguagens de programação suportam arrays com índices nomeados.
Arrays com índices chamados são chamados de matrizes associativas (ou hashes).
O JavaScript não suporta matrizes com índices nomeados.
Em JavaScript, matrizes usar índices numerados:
Exemplo
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"
Tente você mesmo " Em JavaScript, objetos usar índices nomeado.
Se você usar um índice chamado, quando aceder a um array, JavaScript irá redefinir a matriz para um objeto padrão.
Após a redefinição automática, métodos e propriedades de Array irá produzir resultados indefinidos ou incorretas:
Exemplo:
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
Tente você mesmo " Terminar uma definição de matriz com uma vírgula
Incorreta:
points = [40, 100, 1, 5, 25, 10,];
Alguns motores de JSON e JavaScript irá falhar, ou se comportar de forma inesperada.
Corrigir:
points = [40, 100, 1, 5, 25, 10];
Terminar uma definição de objeto com uma vírgula
Incorreta:
person = {firstName:"John", lastName:"Doe", age:46,}
Alguns motores de JSON e JavaScript irá falhar, ou se comportar de forma inesperada.
Corrigir:
person = {firstName:"John", lastName:"Doe", age:46}
Indefinida não é nulo
Com JavaScript, null é para objetos, indefinido é para variáveis, propriedades e métodos.
Para ser nulo, um objeto tem que ser definido, caso contrário ele será indefinido.
Se você quiser testar se existe um objeto, isto irá lançar um erro se o objeto é indefinido:
Incorreta:
if (myObj !== null && typeof myObj !== "undefined")
Devido a isso, você deve testar typeof () em primeiro lugar:
Corrigir:
if (typeof myObj !== "undefined" && myObj !== null)
Esperando Âmbito nível de bloco
O JavaScript não criar um novo escopo para cada bloco de código.
É verdade que em muitas linguagens de programação, mas não é verdade em JavaScript.
É um erro comum, entre os novos desenvolvedores de JavaScript, para acreditar que este código retorna indefinido: