Javascript Flashcards
Características do Javascript
- Você não tem que se preocupar com o fato dos métodos serem públicos, privados ou protegidos, e você não tem que implementar interfaces;
- Orientada a objeto. Sem distinção entre tipos e objetos. A herança é feita através do protótipo e as propriedades e métodos podem ser adicionadas a qualquer objeto dinamicamente;
- Você não tem de declarar todas as variáveis, classes e métodos;
- Os tipos de dados das variáveis não precisam ser declarados (tipagem dinâmica, vagamente tipado)
- Variáveis, parâmetros e tipo de retorno da função não são explicitamente tipados;
- Não pode escrever automaticamente no disco rigído;
- JavaScript é case-sensitive;
- Recomenda-se sempre adicionar ponto e vírgula no final de suas declarações;
Como declarar variáveis no Javascript
- var
- Declara uma variável, opcionalmente, inicializando-a com um valor.
- Ex.:
- var x = 42;
-
x = 42;
- Essa declaração gera aviso de advertência e deve ser evitada.
- let y = 13;
- let
- Declara uma variável local de escopo do bloco, opcionalmente, inicializando-a com um valor.
- const
- Declara uma constante de escopo de bloco, apenas de leitura.
Um identificador JavaScript deve começar com uma letra, underline (_
), ou cifrão ($
); os caracteres subsequentes podem também ser números (0-9). Devido JavaScript ser case-sensitive, letras incluem caracteres de “A” a “Z” (maiúsculos) e caracteres de “a” a “z” (minúsculos).
Uma variável declarada usando a declaração var
ou let
sem especificar o valor inicial tem o valor undefined.
Uma tentativa de acessar uma variável não declarada resultará no lançamento de uma exceção ReferenceError.
Escopo de variável
Quando você declara uma variável fora de qualquer função, ela é chamada de variável global, porque está disponível para qualquer outro código no documento atual. Quando você declara uma variável dentro de uma função, é chamada de variável local, pois ela está disponível somente dentro dessa função.
Exemplos:
Por exemplo o código a seguir exibirá 5, porque o escopo de x
está na função (ou contexto global) no qual x
é declarado, não o bloco, que neste caso é a declaração if
.
if (true) {
var x = 5;
}
console.log(x); //
5
Esse comportamento é alterado, quando usado a declaração let introduzida pelo ECMAScript 6.
if (true) {
let y = 5;
}
console.log(y); // ReferenceError: y não está definido
O que é hoisting? (variável de elevação)
Outra coisa incomum sobre variáveis em JavaScript é que você pode utilizar a variável e declará-la depois, sem obter uma exceção. Este conceito é conhecido como hoisting; variáveis em JavaScript são num sentido “hoisted” ou lançada para o topo da função ou declaração. No entanto, as variáveis que são “hoisted” retornarão um valor undefined. Então, mesmo se você usar ou referir a variável e depois declará-la e inicializá-la, ela ainda retornará undefined.
Exemplos:
/* Exemplo 1 */
var x;
console.log(x === undefined); // exibe “true”
x = 3;
/* Exemplo 2 */
var myvar = “um valor”;
(function () {
var myvar;
console.log(myvar);
// undefined myvar = “valor local”;
})();
Constantes
Outra coisa incomum sobre variáveis em JavaScript é que você pode utilizar a variável e declará-la depois, sem obter uma exceção. Este conceito é conhecido como hoisting; variáveis em JavaScript são num sentido “hoisted” ou lançada para o topo da função ou declaração. No entanto, as variáveis que são “hoisted” retornarão um valor undefined. Então, mesmo se você usar ou referir a variável e depois declará-la e inicializá-la, ela ainda retornará undefined.
Exemplos:
/* Exemplo 1 */
var x;
console.log(x === undefined); // exibe “true”
x = 3;
/* Exemplo 2 */
var myvar = “um valor”;
(function () {
var myvar;
console.log(myvar);
// undefined myvar = “valor local”;
})();
Quais os tipos de dados?
Seis tipos de dados são os chamados primitivos:
- Boolean. true e false.
- null. Uma palavra-chave que indica valor nulo. Devido JavaScript ser case-sensitive, null não é o mesmo que Null, NULL, ou ainda outra variação.
- undefined. Uma propriedade superior cujo valor é indefinido.
- Number. 42 ou 3.14159.
- String. “Howdy”
- Symbol (novo em ECMAScript 6). Um tipo de dado cuja as instâncias são únicas e imutáveis.
- e Object
JavaScript é uma linguagem dinamicamente tipada. Isso significa que você não precisa especificar o tipo de dado de uma variável quando declará-la, e tipos de dados são convertidos automaticamente conforme a necessidade durante a execução do script.
Array literal
var coffees = ["French Roast", "Colombian", "Kona"];
-
var fish = ["Lion", , "Angel"];
- Esse array tem dois elementos com valores e um elemento vazio (fish[0] é “Lion”, fish[1] é undefined, e fish[2] é “Angel” ).
-
var myList = ["home", , "school", ];
- Se você incluir uma vírgula à direita no final da lista dos elementos, a vírgula é ignorada. No exemplo a seguir, o comprimento do array é três. Não há nenhum
myList[3]
. Todas as outras vírgulas na lista indicam um novo elemento.
- Se você incluir uma vírgula à direita no final da lista dos elementos, a vírgula é ignorada. No exemplo a seguir, o comprimento do array é três. Não há nenhum
- No exemplo a seguir, o comprimento do array é quatro, e myList[0] e myList[2] são undefined.
var myList = [, "home", , "school"];
- No exemplo a seguir, o comprimento do array é quatro, e myList[1] e myList[3] são undefined. Apenas a última vírgula é ignorada.
var myList = ["home", , "school", ,];
O que são closures?
Uma closure é a combinação de uma função com as referências ao estado que a circunda (o ambiente léxico). Em outras palavras, uma closure lhe dá acesso ao escopo de uma função externa a partir de uma função interna. Em JavaScript, as closures são criadas toda vez que uma função é criada, no momento da criação da função. Exemplo:
function init() {
var name = "Mozilla"; // name é uma variável local criada pelo init
function displayName() {
// displayName() é a função interna, uma closure
console.log(name); // usa a variável declarada na função pai
}
displayName();
}
init();
A função init() cria uma variável local chamada name, e depois define uma função chamada displayName(). displayName() é uma função aninhada (uma closure) — ela é definida dentro da função init(), e está disponivel apenas dentro do corpo daquela função. Diferente de init(), displayName() não tem variáveis locais próprias, e ao invés disso reusa a variável name declarada na função pai.