Eloquent JavaScript – Parte 1

Já programei em Javascript diversas vezes, mas nunca me disciplinei a aprender a linguagem direito. Sempre seguia tutoriais para descobrir o jeito mais direto de fazer o que eu queria.

Recentemente voltei a programar em Javascript e desta vez decidi ler livros introdutórios sobre essa linguagem. Comecei com o Eloquent Javascript, que está disponível gratuitamente online.

Capítulos 1 e 2

Esses dois capítulos apresentam o básico de programação e a sintaxe básica de Javascript. Passei rapidamente por esses dois capítulos. Uma coisa que eu não lembrava (ou não sabia :P) era o seguinte:

Temos 6 tipos em Javascript: number, string, boolean, object, function e undefined.

O interessante é que segundo a especificação do Javascript (ecma) number é implementado como um double 64 bits (padrão IEEE 754), ou seja, 1 bit pra sinal, 11 bits para expoente e 52 bits de precisão. Isso significa que podemos representar inteiros entre -2^{52} - 1 a 2^{52} -1.

Capítulo 3 – Funções

Neste capítulo comenta-se sobre funções em programação geral e em Javascript. Há duas principais novidades que aprendi aqui.

Quando o número de parâmetros passados a uma função é menor que o número de parâmetros exigidos pela mesma, os parâmetros faltantes são completados com undefined. Por outro lado, se o número de parâmetros passados for maior, os parâmetros excedentes são descartados.

A outra coisa é que apenas funções definem escopo. Ao contrário de linguagens como C++, blocos ou laços não definem escopo. Assim, considere o exemplo abaixo:

var a = 2;
for(var i = 0; i <= 10; i++){
    var a = i;
}
// 'a' vale 10

As variáveis a no código acima se referem à mesma coisa. Agora considere o mesmo exemplo, só que com uma função:

function f(){
    var a = 10; 
}
var a = 2;
f();
// 'a' vale 2

Neste exemplo a variável a tem escopo local em f.

Capítulo 4 – Estruturas de dados: Objetos e Arrays

Uma das principais estruturas em Javascript é o Object. Ele é basicamente um array associativo (também conhecido como dicionário), ou seja, um array onde podemos usar strings como índices e elementos podem ser adicionados dinamicamente.

A sintaxe básica para a instanciação de um objeto é

var obj = new Object();
// ou simplesmente...
var obj = {};

Para inserir uma chave no objeto, podemos usar alguma das seguintes alternativas:

obj["chave"] = valor;
// ou...
obj.chave = valor;
// ou...
var v = "chave";
obj[v] = valor;

Se a chave não existia, ela é criada. Se já existia, seu valor é substituído. Para acessar o valor é da mesma forma, só que se tentarmos acessar o valor de uma chave que não existe, retorna-se undefined.

Para deletar uma chave do dicionário:

delete obj["chave"];
// ou...
delete obj.chave;
// ou...
var v = "chave";
delete obj[v];

Para testar se uma chave está definida no dicionário, usa-se a keyword in:

key in obj; // retorna um boolean

Outra estrutura útil é o Array, que pode ser instanciado como

var arr = new Array();
// ou simplesmente...
var arr = [];

Essa estrutura funciona com um mecanismo parecido com o dicionário, com a principal diferença de que as chaves devem ser números naturais e ao criar uma chave de valor N, todos os índices de 0 a N que ainda não existem são criados também.

Exemplo,

var arr = [];
arr[0] = 2; // arr = [2]
arr[4] = "oi"; // arr = [2, undefined, undefined, undefined, "oi"] 

Capítulo 5 – Tratamento de erros

Javascript possui um mecanismo de tratamento de exceção, com sintaxe try-catch-finally parecida com a de Java:

function foo(){
    throw Error("mensagem de erro");
}

try {
    foo();
}
catch (erro) {
    alert(erro.message); // Imprime "mensagem de erro"
}
finally {
    // Trecho de código A
}
// Trecho de código B

Basicamente qualquer objeto pode ser repassado para a keyword throw e nesse caso o bloco do catch será chamado. No exemplo, a variável erro apontará para o objeto Error, que é pré-definido e possui o campo message.

O bloco do finally é chamado no caso em que ocorre uma interrupção prematura do bloco try ou do catch (via return ou outro throw, por exemplo), representando um fluxo de código alternativo ao trecho B, que provavelmente só deve ser executado na ausência de erros.

Uma dúvida que me surgiu é como tratar diferentes tipos de exceções. Em Java é possível utilizar múltiplos blocos de catch. Já em Javascript, você deve tratar explicitamente através de if e else‘s. Uma alternativa nesse caso é adicionar no objeto um campo errorType contendo uma string, por exemplo [3].

Referências

[1] Dynamically creating keys in javascript associative array
[2] W3 Schools – JavaScript Array Object
[3] Handling specific errors in JavaScript

Os comentários estão fechados.

%d bloggers like this: