Pular para o conteúdo principal

Variáveis e Tipos

Diferentes linguagens lidam com declaração de variáveis e tipagem de várias maneiras. Vamos comparar como cada linguagem declara variáveis e lida com tipos.

Declaração de Variáveis​

// Primitives
let name = "John";
const age = 30;
let isActive = true;

// Arrays
let numbers = [1, 2, 3];
let items = ["apple", "banana"];

// Objects
let person = { name: "John", age: 30 };
let user = new Object();

// Maps
let map = new Map();
map.set("key", "value");

// Sets
let set = new Set([1, 2, 3]);

// Dynamic typing
let value = 42;
value = "now a string"; // allowed

Sistema de Tipos​

// Type checking - primitives
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"

// Type checking - advanced
Array.isArray([1, 2]); // true
instanceof Date; // check instance
Object.prototype.toString.call([]); // "[object Array]"

// Implicit conversions
"5" + 3; // "53" (string concatenation)
"5" - 3; // 2 (numeric conversion)
true + 1; // 2 (boolean to number)

// Explicit conversions
Number("42"); // 42
String(42); // "42"
Boolean(1); // true
parseInt("42px"); // 42
parseFloat("3.14"); // 3.14

Principais Conclusões​

  • Tipagem estática vs dinâmica -- Linguagens estáticas (Rust, Go, Java, C#, Swift) aplicam tipos em tempo de compilação, então erros de tipo são detectados antes da execução do programa. Linguagens dinâmicas (JavaScript, Python, PHP, Ruby) permitem que variáveis mudem de tipo em tempo de execução: let x = 42; x = "hello" é válido em JavaScript. Tipagem estática oferece garantias mais fortes e melhor ferramental; tipagem dinâmica acelera a prototipagem. Para bases de código grandes ou projetos em equipe, prefira tipagem estática; para scripts rápidos ou trabalho exploratório, tipagem dinâmica pode ser mais flexível.

  • Inferência de tipo -- Muitas linguagens estáticas inferem tipos para que você escreva menos código repetitivo. C# e Java 10+ usam var; C++ usa auto; Rust e Swift usam let; Go usa := para declaração curta. Por exemplo, let x = 42 em Rust infere i32, e name := "John" em Go infere string. Zig e C geralmente requerem tipos explícitos. Use inferência onde ela melhora a legibilidade, mas adicione tipos explícitos quando isso clarifica a intenção ou quando a inferência produz resultados surpreendentes.

  • Segurança de tipos e conversões -- Rust e Go evitam conversões implícitas; misturar i32 e f64 em aritmética requer casts explícitos. JavaScript e PHP fazem conversão automática de tipos: "5" + 3 resulta em "53" em JavaScript (concatenação de strings) mas 8 em PHP (conversão numérica). C, C++ e Java permitem conversões de ampliação (ex.: int para long) implicitamente. Prefira linguagens com regras de conversão estritas para robustez; tenha cuidado com conversões implícitas em JavaScript e PHP para evitar bugs sutis.

  • Estilos de declaração de variáveis -- JavaScript usa let e const; PHP usa $variable; Go usa var ou :=; Python e Ruby usam nomes simples. Rust distingue let (imutável) de let mut (mutável); Zig usa const e var. Swift usa let para constantes e var para variáveis. Alinhar seu modelo mental ao estilo de declaração da linguagem ajuda a evitar erros — por exemplo, esquecer que const em JavaScript apenas previne reatribuição, não mutação de objetos.