1. Boolean
2. Number
3. String
4. Null
5. Undefined
6. Symbol
7. Object
// tradicional
function nomeCompleto(nome, sobre) {
return nome + ' ' + sobre;
}
// anônima em variável
const nomeCompleto = function(nome, sobre) {
return nome + ' ' + sobre;
}
nomeCompleto('Mijaro', 'Nomuro')
let radios = [106.1, 105.1, 98.3];
let cores = ['azul', 'verde'];
let animais = []; // <- vetor vazio
animais.push('dogue'); // ['dogue']
// tradicional
for(let i=0; i<cores.length;i++){
console.log(cores[i]);
}
// impr. azul, verde
// for of 👍
for (let cor of cores) {
console.log(cor);
}
// impr. azul, verde
// forEach 👍
cores.forEach(function(cor) {
console.log(cor);
});
// impr. azul, verde
'Hannah'.toLowerCase() === 'hannah'
'Ovo'.replace('O', 'Ou') === 'Ouvo'
'BR4512348ZY'.substr(0, 2) === 'BR'
'Charmander'.indexOf('arma') === 4
radios.push(92.5); // insere no final
radios.pop(); // remove do final
cores.unshift('verm'); // insere no início
cores.shift(); // remove do início
String
char
como em C/C++ e Java, apenas string :wink:"Abc" === 'Abc' // simples é mais legal!! mas basta ser consistente
length
com o seu comprimento:
console.log('Cachorro'.length); // 8
let aranhas = 'fofofauna';
const nomeCompleto = primeiro + ' ' + ultimo; // concatenou
// template string
let fruta = `Kiwi`;
// string normal
let fruta = 'Kiwi';
const peso = 82;
const nome = 'Kagaro Nakama';
// com template strings
const frase = `${nome} pesa ${peso}kg`;
// "Kagaro Nakama pesa 82kg"
const peso = 82;
const nome = 'Kagaro Nakama';
// concatenando strings normais
const frase = nome + ' pesa ' + peso + 'kg';
// "Kagaro Nakama pesa 82kg"
${...}
. Exemplo:
// supondo que existem variáveis preco=5 e qtde=2
let aConta = `Sua conta é R$ ${preco * qtde - 3}`;
// "Sua conta é R$ 7"
// supondo variáveis dia, mês, ano e func. obtemMes
const data = `${dia} de ${obtemMes(mes)} de ${ano}`;
// Ex: "20 de janeiro de 2021"
const tom = 128;
const corCinza = `rgb(${tom}, ${tom}, ${tom})`;
// Ex: "rgb(128, 128, 128)"
console.log(typeof "texto"); // imprime "string"
console.log(typeof `texto`); // imprime "string"
// com template string
let poesia = `Cavei cavei cavei
Isto não é um poema
Mas é profundo.`;
// com string normal
let poesia = 'Cavei cavei cavei\n' +
'Isto não é um poema\n' +
'Mas é profundo.';
\n
dentro da template stringnew
Object
let carro = {}; // mais comum, mais expressivo
new
:
let carro = new Object();
let carro = {
cor: 'vermelho',
fabricante: {
nome: 'Fiat',
origem: 'Itália'
},
ligar: function() {
this.injetaCombustivel();
// ...faz outras coisas
},
/* ... */
};
function Moto(modelo, dono) {
this.modelo = modelo; // Lembre que 'this' dentro de um
this.dono = dono; // objeto aponta para ele mesmo
}
let moto1 = new Moto('Kawasaki', 'Ninja Jiraya');
let moto2 = new Moto('Harley Davidson', 'Lula Molusco');
modelo
e dono
this
para definir propriedades de um
objeto novinho que está sendo criadofunction Leguminosa(nome, calorias) { // legal!
// this.nome = nome
// ...
}
function verdura(nome, calorias) { // funciona, mas evitamos
// this....
}
new
modelo
, dono
etc.), colocarmos também
alguns métodos, podemos falar que temos algo semelhante a uma
classe das linguagens OO “tradicionais”:
function Moto(modelo, dono) {
/* ... */
this.toString = function() {
return `${this.modelo} do(a) ${this.dono}`;
};
}
let motoca = new Moto('Honda Biz', 'Rubinho');
console.log(motoca.toString()); // Honda Biz do Rubinho
function Contato(nome, email) {
this.nome = nome;
this.email = email;
this.linkParaMensagem = function() {
return `mailto:${this.email}`;
};
}
const lista = [
new Contato('huguinho', 'h@gma.br'),
new Contato('zezinho', 'j@gma.br'),
new Contato('luizinho', 'l@gma.br')
];
linkParaMensagem
a nível da classe, ao invés de
na instânciaprototype
:
function ContatoV2(nome, email) {
this.nome = nome;
this.email = email;
// this.linkParaMensagem = function() { ... }
}
ContatoV2.prototype.linkParaMensagem = function() {
return `mailto:${this.email}`;
};
// lembre-se: função é um objeto, logo, pode ter propriedades
ContatoV2
para alocar a lista de contatos, teremos:
prototype
de onde ele
pode “herdar” propriedades
let novo = {};
console.log(novo.toString()); // [object Object]
prototype
apontado para um objeto que possui algumas
propriedades (e.g., toString
)
Object.prototype
prototype
chainundefined
. Por exemplo:
let nome = { firstName: 'Paul', lastName: 'Irish' };
nome.firstName; // achou no próprio objeto
nome.toString(); // achou em Object.prototype
nome.middleName; // não achou, undefined
prototype
que
aponta para um objeto “global” e único, o Function.prototype
iniciaControlesVideo()
video.play()
new VideoPlayer()
apply
ou call
: iniciaControlesVideo.call(null)
this
aponta varia em cada uma das 4 formasfunction soma(a, b) {
return a + b;
}
soma(40, 2); // invocação. Retorna 42
let s = soma;
s(21, 21); // invocação. Retorna 42
this
é sempre definido para o objeto global window
const contador = {
valor: 0,
incrementa: function(qtde) {
this.valor += qtde ? qtde : 1;
}
}
contador.incrementa(); // contador.valor = 1
contador.incrementa(10); // contador.value = 11
this
aponta para a instância do objeto dono do método invocadolet usuario = {
nome: 'Couto',
cumprimenta: function() { // invocação de método
setTimeout(function() {
console.log(`Olá, aqui é ${this.nome}`);
}, 5000);
}
};
usuario.cumprimenta(); // 'Olá, aqui é undefined'... pq??
this
dentro de usuario.cumprimenta
aponta para a
instância do objeto usuario
, como esperadosetTimeout
invoca usuario.cumprimenta
isso é feito como uma função (e não método)
this
passa a apontar para window
, que não tem uma variável nome
new
, dizemos que
a função é um construtor:
function Contato(nome) {
this.nome = nome;
}
let presidente = new Contato('Seu Adamastor'); // construtor
new
, três coisas acontecem:
prototype
é o mesmo do
da funçãothis
dentro da função aponta para o novo objetoreturn
, this
é retornado automaticamentenew
, shit will happen
function Contato(nome) {
this.nome = nome;
}
let presidente = Contato('Seu Custódio'); // invoc. função
window.nome === "Seu Custódio"
presidente === undefined
let Mamifero = function(nome) {
this.nome = nome;
};
Mamifero.prototype.diz = function() {
return this.fala || '';
};
let mamiferoGenerico = new Mamifero('mamifero');
mamiferoGenerico.diz(); // retorna ''
let Gato = function(nome) {
this.nome = nome;
this.fala = 'Miau';
}
Gato.prototype = new Mamifero();
let gato = new Gato('Tom');
gato.diz(); // retorna 'Miau'
function cadastrar() {
// ...
}
const cadastrar = function() {
// ...
};
const cadastrar = () => {
// ...
};
function
return
implícitothis
function ciao() {
return 'Ciao';
}
function oi(prim, ult) {
return `Oi ${prim} ${ult}`;
}
function hi(name) {
return 'Hi ' + name;
}
function fatorial(n) {
let resultado = 1;
while (n > 1) {
resultado *= n;
n--;
}
return resultado;
}
let ciao = () => 'Ciao';
let oi = (prim, ult) => `Oi ${prim} ${ult}`;
let hi = name => 'Hi ' + name;
let fatorial = n => {
let resultado = 1;
while (n > 1) {
resultado *= n;
n--;
}
return resultado;
}
let usuarios = ['Joel', 'Fani', 'Fúlvio'];
let alunos = [{ matricula: '...' }];
let numeros = [1, 4, 2, 5];
usuarios.filter(function(nome) {
return nome.startsWith('F');
});
usuarios.filter(nome => nome.startsWith('F'));
alunos.find(function(aluno) {
return aluno.matricula === '2005046102';
});
alunos.find(al => al.matricula === '2005046102');
numeros.map(function(numero) {
return numero ** 2;
});
numeros.map(numero => numero ** 2);
this
léxicofunction
) perdem o valor do this
léxico (que estava no contexto) se invocados como funções
this
léxico:
let usuario = { // ❌
nome: 'Couto',
cumprimenta: function() {
setTimeout(function() {
console.log(`Olá, aqui é ${this.nome}`);
}, 5000);
}
};
usuario.cumprimenta(); // 'Olá, aqui é undefined'
let usuario = { // ✅
nome: 'Couto',
cumprimenta: function() {
setTimeout(() => {
console.log(`Olá, aqui é ${this.nome}`);
}, 5000);
}
};
usuario.cumprimenta(); // 'Olá, aqui é Couto'