Carregando agora

Por que o JavaScript mente para você: desmascarando a “mentira” dos Arrays

Por que o JavaScript mente para você? Programador confuso cercado por ícones de JavaScript, Rust e Python

Ah, o JavaScript. Amado por uns, odiado por outros, tolerado pela maioria que paga boletos com ele. E hoje, vamos explorar uma das maiores “mentiras” que essa linguagem nos conta: os Arrays. Portanto, sente-se e prepare-se, porque tem polêmica na tela. Então, será por que o JavaScript mente para você?

O que é um Array de verdade?

Antes de apontar o dedo para o JavaScript, precisamos concordar no que é um Array de verdade. Segundo os livros de computação (aqueles que a gente finge que leu), um Array é uma região contígua de memória onde elementos são armazenados sequencialmente. Isso significa:

  1. Cada elemento ocupa um espaço fixo na memória.
  2. É possível acessar qualquer elemento instantaneamente (O(1)), com base na posição.

Com isso esclarecido, vamos jogar esse conceito contra o JavaScript. Afinal, no fundo, o “Array” do JavaScript não é um Array. Ele é, na verdade, algo mais próximo de uma Linked List com anabolizantes.

A “mentira” do Array em JavaScript

No JavaScript, criar um Array é incrivelmente simples. Você faz algo como:

let meuArray = [];
meuArray.push(1);
meuArray.push(2);
meuArray.push(3);

E pronto! Um Array funcional e bonitinho, certo? Errado. Por debaixo dos panos, o que você tem é uma estrutura de dados muito mais flexível (e confusa). Vamos entender por quê:

  1. Flexibilidade: Você pode adicionar e remover elementos sem precisar definir o tamanho do Array no início. Isso parece prático, mas tem um custo.
  2. Custo oculto: Quando você adiciona elementos a mais, o JavaScript precisa criar um novo espaço na memória e mover tudo para lá. Esse processo, chamado de “amortização”, transforma o acesso de O(1) para O(n) em momentos específicos. Além disso, isso pode causar lentidão em aplicações maiores.
  3. Abstração: Em vez de um Array “puro”, você está lidando com algo mais próximo de uma lista dinâmica. Essa abstração é eficiente para a maioria dos casos, mas pode enganar em cenários de alta demanda.

A prova no código

Vamos pegar um exemplo prático:

let array = [];
array.push(1);
array.push(2);
array.push(3);
array.push(4); // E agora?

Aqui, se o espaço original alocado não comportar quatro elementos, o JavaScript cria um novo Array maior, copia os elementos antigos e adiciona o novo. Esse processo consome tempo e memória.

Em linguagens como Rust, você tem que definir o tamanho do Array ao criá-lo:

let meu_array: [i32; 3] = [0; 3];

Se precisar de mais espaço? Azar o seu. Você precisa criar um novo Array manualmente e transferir os dados. Por isso, a diferença na abordagem é significativa.

Por que o JavaScript mente?

Agora, a pergunta que não quer calar: por que o JavaScript mente para você? A resposta é simples. Ele quer facilitar sua vida (e atrair mais desenvolvedores). Quando você cria um “Array” em JavaScript, ele não quer que você se preocupe com tamanhos, tipos ou contiguidades. Ele só quer que você empurre dados lá dentro e seja feliz.

Porém, isso tem um custo. Se você estiver manipulando grandes volumes de dados, essa abstração pode impactar seriamente a performance do seu código. Portanto, é essencial escolher suas batalhas com sabedoria.



Mas e aí, quem mente mais: JavaScript ou Python?

Se você acha que o JavaScript é o único vilão da história, pense novamente. No Python, temos as listas, que são outra “mentira”:

meu_array = []
meu_array.append(1)
meu_array.append(2)
meu_array.append(3)

Porém, até o Python tem a decência de chamar isso de “list” em vez de “Array”. Respeito é tudo, não é mesmo? Assim, podemos perdoar o Python por sua honestidade. Afinal, ele deixa claro que você está usando listas, e não Arrays contíguos.

A questão da performance

Se você rodar benchmarks comparando a manipulação de Arrays entre JavaScript e Rust, o resultado é previsível: Rust vai dar uma surra. Isso porque ele segue todas as regras de contiguidade e alocação eficiente de memória, enquanto o JavaScript está ocupado tentando não te frustrar.

Entretanto, nem tudo está perdido. A abstração do JavaScript permite flexibilidade e facilidade de uso. Isso é ideal para projetos de menor escala ou menos críticos em termos de performance. Além disso, para a maioria dos casos, a diferença na performance pode não ser perceptível.

Conclusão: JavaScript é uma linguagem de “mentira”?

Depende. Se você quer um controle absoluto sobre a memória, JavaScript definitivamente não é para você. Mas se o seu objetivo é resolver problemas de forma rápida e acessível, ele é uma mão na roda.

Esse vídeo abaixo do canal do Lucas Montano, trata sobre esse assunto. Dê uma olhada!

Resumo da ópera: o JavaScript não mente, ele só esconde algumas verdades para facilitar a sua vida. E se você estiver insatisfeito com essa “mentira”, sempre há outras opções no mercado (alô, Rust!). Contudo, no final do dia, a linguagem que realmente importa é aquela que paga suas contas.

Agora vai lá e desabafa sobre o JavaScript naquele grupo de devs. Só não esquece de deixar um “push” no seu aprendizado antes. E, se der erro, bem-vindo ao clube.

Angular performance Angular Signals Apps Multiplataforma automação de tarefas Backend Boas Práticas boas práticas Git controle de versão desenvolvedores desenvolvimento backend Desenvolvimento de Software Desenvolvimento Frontend Desenvolvimento Mobile Desenvolvimento Web desenvolvimento ágil devops dicas para devs escalabilidade ferramentas de Git ferramentas de programação Front-end Git Hooks integração contínua inteligência artificial JavaScript Linguagens de Programação Media Queries mercado de tecnologia Mercado de Trabalho Tech Node.js produtividade dev Programação Programação Orientada a Objetos programação para iniciantes programação reativa Python React React Suspense Rust Tecnologia Trunk-Based Development web development workflow Git workflows Git

Publicar comentário

O que temos aqui?