JavaScript é uma linguagem especial. Não importa o quanto você o estude, sempre haverá momentos que farão até mesmo um profissional experiente começar a coçar nabos.
Este artigo fornece alguns quebra-cabeças JavaScript relacionados ao comportamento incomum da linguagem. Eles ajudarão alguém a aprender algo novo, e alguém simplesmente poderá atualizar seus conhecimentos.
Tarefa 1 - "BANANA"
Esse tweet na época ganhou popularidade no segmento do Twitter em inglês, dedicado ao JavaScript. Não menos importante, porque não é de todo óbvio o que está acontecendo aqui.
SoluçãoO "b" e "a" no início são apenas strings que somam "ba". Depois de "a", você vê dois sinais de adição (+). O primeiro deles é destinado à adição, mas o segundo é um operador unário que converte a sequência seguinte em um número. Como o segundo "a" não pode ser convertido em um número, ele é convertido em "NaN".
Assim, temos: “ba” + “NaN” + “a” - “baNaNa”. toLowerCase insidiosamente nos dá o resultado final - "banana".
Tarefa 2 - Adicionando matrizes
Essa é uma tarefa simples, mas uma pessoa não familiarizada com o funcionamento do JavaScript pode ser confusa.
SoluçãoPrimeiro, as matrizes são convertidas em seqüências de caracteres - "1,2,3" e "4,5,6". O resultado da concatenação dessas linhas será a resposta final - a string "1,2,34,5,6".
Tarefa 3 - função parseInt ()
De todas as tarefas JavaScript, essa foi a mais difícil para mim.
Se provavelmente tudo foi encontrado com o parseInt no JavaScript, de uma forma ou de outra, menos pessoas sabem da existência do segundo parâmetro opcional "radix". Essa é a base do sistema numérico do primeiro argumento.
SoluçãoO primeiro argumento "nulo" é convertido em uma seqüência de caracteres. O primeiro caractere dessa sequência "n" é convertido em um número no sistema numérico com base 24. O resultado dessa conversão é 23.
parseInt continua analisando o caractere de sequência por caractere até encontrar um caractere que não pode ser convertido em número. Este é o segundo caractere da string - “u”, pois não existe esse dígito no sistema numérico com base 24.
Desta forma:
parseInt(null, 24) === parseInt("null", 24) parseInt("null", 24) === parseInt("n", 24) parseInt("n", 24) === 23
Tarefa 4 - números de ponto flutuante de precisão
Parece horrível, mas, para ser justo, em um grau ou outro, você pode encontrar um semelhante em qualquer idioma que use cálculos de ponto flutuante.
Solução console.log(0.1 + 0.2);
As constantes "0.2" e "0.3" no programa serão aproximadas aos valores "reais" na representação da máquina. E aconteceu que o dobro mais próximo de "0,2" é maior que o número racional "0,2". Por outro lado, o dobro mais próximo de "0,3" é menor que o racional "0,3".
Assim, a soma de "0,1" e "0,2" no código é maior que o racional "0,3" e a constante "0,3" no código é menor que o racional "0,3".
Nota para a anfitriã: nunca use "===" ou "==" para trabalhar com números de ponto flutuante. Use em vez disso
if (abs(x - y) < toleranceValue) { ... }
Conclusão
Sim, ao trabalhar com JavaScript, há muitos momentos WTF. Por outro lado, que outra língua pode dar tantas sensações inesquecíveis?
Abaixo está uma lista de links (em inglês) para um estudo aprofundado das tarefas desta publicação (e não apenas):