Oops, eu fiz de novo: depuração de erros comuns em JavaScript

Oops, eu fiz de novo: depuração de erros comuns em JavaScript

Às vezes, escrever código JavaScript pode ser desafiador e, em outras ocasiões, até mesmo assustador, algo familiar para muitos desenvolvedores. Durante o trabalho, erros inevitavelmente surgem, e alguns deles ocorrem com frequência. Este artigo, voltado para desenvolvedores iniciantes, aborda esses erros e como resolvê-los. Para melhor clareza, os nomes das funções, propriedades e objetos foram extraídos de uma canção popular. Tudo isso ajuda a memorizar rapidamente como corrigir erros comuns.

Lembramos: para todos os leitores do «Habr» — desconto de 10.000 rublos na inscrição em qualquer curso Skillbox com o código promocional «Habr».

A Skillbox recomenda: Curso Prático ‘Desenvolvedor Móvel PRO’.

TypeError: propriedade indefinida

let girl = {
    name: "Lucky",
    location: "Hollywood",
    profession: "star",
    thingsMissingInHerLife: true,
    lovely: true,
    cry: function() {
        return "chora, chora, chora em seu coração solitário"
    }
}
console.log(girl.named.lucky)

O exemplo de código acima gera o erro Uncaught TypeError: Cannot read property ‘lucky’ of undefined. O problema é que o objeto girl não possui a propriedade named, embora tenha a propriedade name. E como a propriedade girl.named não está definida, não é possível acessá-la, uma vez que formalmente não existe. Mas se você substituir girl.named.lucky por girl.name, tudo funcionará e o programa retornará Lucky.

Mais informações sobre propriedades podem ser lidos aqui.

Formas de corrigir erros TypeError

Os erros TypeError ocorrem quando um programador tenta realizar ações com dados que não correspondem a um tipo especificado. Um exemplo disso é a utilização de .bold(), a solicitação de uma propriedade undefined ou a chamada de uma função que, na verdade, não é uma função.

Assim, se você tentar chamar girl (), aparecerá o erro Uncaught TypeError: yourVariable.bold is not a function e girl is not a function, pois na verdade você está chamando um objeto e não uma função.

Para corrigir os erros, é necessário estudar as variáveis. Assim, o que é girl? E o que é girl.named? Você pode descobrir isso analisando o código, exibindo variáveis com console.log, usando o comando debugger ou chamando o nome da variável no console. É preciso ter certeza de que é possível operar o tipo de dados contido na variável. Se não for adequado, altere-o; por exemplo, adicione uma condição ou um bloco try..catch — e você terá controle sobre a execução da operação.

Transbordamento de pilha

Se acreditarmos nos autores da canção Baby One More Time (sim, é Britney Spears), a palavra hit neste contexto significa o desejo da cantora de receber um telefonema novamente (aqui uma explicação sobre o contexto da canção, nota do tradutor). É bem possível que esse desejo leve a um aumento no número de ligações na vida real. Mas na programação, isso é recursão, que pode levar a um erro em caso de estouro da pilha de chamadas.

Os erros aparecem da seguinte forma:

Error: Out of stack space (Edge)
InternalError: too much recursion (Firefox)
RangeError: Maximum call stack size exceeded (Chrome)

O estouro da pilha ocorre se o desenvolvedor não considerar o caso base na recursão ou se o código não fizer referência ao caso previsto.

function oneMoreTime(stillBelieve=true, loneliness=0) {
    if (!stillBelieve && loneliness < 0) return
    loneliness++
    return oneMoreTime(stillBelieve, loneliness)
}

Neste caso, stillBelieve nunca pode assumir o valor false, portanto, a função oneMoreTime será chamada a cada vez, mas a execução da função nunca será concluída.

Se começarmos a contar com dois amigos, isso reduzirá a loneliness (solidão), e a ligação pode não ser mais esperada.

function oneMoreTime(stillBelieve=true, loneliness=0) {
    if (!stillBelieve && loneliness < 0) return
    loneliness--
    stillBelieve = false
    return oneMoreTime(stillBelieve, loneliness)
}

Um exemplo pode ser casos com loops infinitos, onde o sistema não gera uma mensagem de erro, e a página em que o código JavaScript está sendo executado simplesmente congela. Isso acontece se o loop while não tiver uma condição de término.

let worldEnded = false
 
while (worldEnded !== true) {
  console.log("Keep on dancin' till the world ends")
}

O problema pode ser resolvido da seguinte forma:

let worldEnded = false
 
while (worldEnded !== true) {
  console.log("Keep on dancin' till the world ends")
  worldEnded = true
}

Depuração de loops infinitos e recursões

Se você encontrar um problema com um loop infinito, no Chrome ou Edge, feche a aba, enquanto no Firefox, feche a janela do navegador. Depois disso, é necessário analisar o código com atenção. Se não conseguir encontrar o problema, adicione o comando debugger ao loop ou função e verifique o valor das variáveis. Se o resultado não corresponder ao esperado, substitua-o, o que pode ser feito facilmente.

No exemplo acima, o debugger deve ser adicionado como a primeira linha da função ou do loop. Depois, é necessário abrir a aba de depuração no Chrome e analisar as variáveis no escopo. Com o botão next, é possível rastrear as mudanças a cada iteração. Fazer tudo isso é simples, e na maioria das vezes o problema está localizado.

Você pode ler mais sobre tudo isso aqui (para Chrome) e aqui (para Firefox).

Erro de sintaxe

Um dos erros mais comuns em JavaScript é o SyntaxError. Extensões do editor de texto podem ajudar a evitá-los. Por exemplo, o Bracket Pair Colorizer destaca os parênteses no código com diferentes cores, e o Prettier ou ferramentas de análise semelhantes permitem localizar rapidamente os erros. A melhor estratégia para reduzir a probabilidade de SyntaxError é minimizar a complexidade da aninhagem.

Compartilhe nos comentários: o que você faz para evitar cometer erros ou detectá-los e corrigi-los rapidamente?

A Skillbox recomenda:

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster