- Notifications
You must be signed in to change notification settings - Fork6
danielnegrisolibatista/curso-javascript-es6-essencial
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
JavaScript ES6 essencial
- Autor: Guilherme Cabrini da Silva
- Origem: Digital Innovation One
- Javascript foi lançado em setembro de 1995
- Foi lançado junto com a versão beta do Netscape 2.0
- Criado por Brendan Eich
- O JavaScript teve dois nomes anteriores: Mocha e Livescript
- ECMAScript é uma especificação de linguagem script criada pela Ecma International, utilizada por linguagens como: ActionScript, JScript e Javascript.
- O comitêTC39 é quem avalia aspropostas de melhorias
- Linguagem interpretada
- O JavaScript possui tipagem fraca e dinâmica pois
- 1 - O tipo da variável no JavaScript é definido no momento de sua atribuição, esse processo se chama inferência de tipo.
- 2 - Não é lançado um erro ou uma Exception durante a execução de: 1 + "texto".
- 3 - Para mudarmos o tipo de uma variável já existente, basta setar um valor de outro tipo:
- 4 - Não é necessário explicitar o tipo na criação de uma variável no JavaScript.
- Typescript é superset da linguagem Javascript
- Flow é um validador da linguagem.
- Funções de primeira classe e ordem maior significa que são funções que pode ser atribuídas a uma variável, pode ser atribuída a uma estrutura de dados, e pode ser passada por argumentos, e até retornada por outras funções.
//funcoes.jsfunctiongetName(){return'Daniel Negrisoli Batista';}functionlogFn(fn){console.log(fn());}//atribuição a uma variávelconstlogFnResult=logFn;//atribuição a uma estrutura de dadosconstobj={logFn:logFn}//função passada por argumentoslogFnResult(getName);
- Closure ou escopo léxico é a capacidade da função "lembrar" do seu contexto de criação.
- Escopo em javascript podem ser de 3 maneiras: global, bloco e função
//escopo.js//escopo global: arquivo todo{//escopo de bloco, dentro dos branchs}functionfn(){//escopo de função}
É a técnica de transforma uma função com vários parâmetros em apenas um sendo que para cada parâmetro e retornando outra função.
//currying.js//função naturalfunctionsomaFn(a,b){returna+b;}//aplicação do curryingfunctionsomaCurrying(a){returnfunction(b){returna+b;}}//chamada função naturalconsole.log(somaFn(1,1));//chamada função curryingconstresultSoma=somaCurrying(1);console.log(resultSoma(1));
Hoisting ou içamento é a capacidade do JavaScript elevar a criação de variáveis e funções ao topo do escopo de suas criações. Existem dois tipos de Hoisting: hoisting de variável e hoisting de função.NoHoisting de variável é elevado a sua criação e não a sua atribução, já noHoisting de função ela é elevado como um todo.
//hoisting-variveis.jsfunctionfnHoistingVar){//Exemplo de variável que não foi ainda 'declarada', devido ao hoisting a váriavel é considerada indefinida ao invés de não declarada (reference error)//nesse console é escrito undefinedconsole.log(text);vartext='Exemplo';//aqui já é retornando stringconsole.log(text);}fnHoistingVar();
//hoisting-funcao.jsfunctionfnHoistingFun()){//mesmo a chamada da função aparecer primeiro que a função, não ocorre erro, porém como boa prática é melhor declarar a função antes de usarlog('Hoisting de função');functionlog(value){console.log(value);}}fnHoistingFun();
O valor da variável nunca muda, caso precise alterar é preciso criar outra.Exemplo:Se precisar inserir um array, você realizar uma cópia inclui o novo item na cópia.Se precisar atualar um objeto, você realizar uma cópia altera o novo item na cópia.
//1-imutabilidade.jsconstuser={name:'Daniel',lastName:'Negrisoli Batista'}//o parâmetro é passado para a função por referência, sendo assim caso ela altere o item o mesmo de onde veio a informação será alterada.functiongetUserWithFullName(user){return{//spread operator ...user,//literal stringfullName:`${user.name}${user.lastName}`}}constuserWithFullName=getUserWithFullName(user);//o retorno é um novo objeto com as alteraçoes desejadasconsole.log(userWithFullName,user);
//2-imutabilidade.js//lista de alunos com nome e notasconststudents=[{name:'Grace',grade:7},{name:'Jennifer',grade:4},{name:'Paul',grade:10},];//retorno de alunos aprovados com nota superior ou igual a 7functiongetApprovedStudents(studentsList){returnstudentsList.filter(student=>student.grade>=7);}console.log('Alunos aprovados');//retorna uma nova lista com os alunsos aprovadosconsole.log(getApprovedStudents(students));//retorna a lista completa de alunosconsole.log('\nLista de alunos');console.log(students);
No momento da criação de variáveis e necessário lembrar dos 3 tipos de escopo do #"auto">
//1-variaveis.jsvarnameVar='Daniel';letnameLet='Daniel';constnameConst='Daniel';console.log(`nameVar :${nameVar}`);console.log(`nameLet :${nameLet}`);console.log(`nameConst :${nameConst}`);
//2-1-variaveis.js//var não respeita o contexto de blocovartest='example';(()=>{//undefined, pois nesse momento não tem valorconsole.log(`Valor dentro do função "${test}"`);if(true){//essa declaração e atribuição sobre para o escopovartest='example';console.log(`Valor dentro do if "${test}"`);}//por isso nesse lugar o test possui o valor atribuido dentro do blococonsole.log(`Valor após a execução do if "${test}"`);})();
//2-2-variaveis.js(()=>{//let respeita o contexto de blocolettest='valor função';console.log(`Valor dentro do função "${test}"`);if(true){//aqui o test não é o mesmo que o anterior, pois ele respeita o contexto de bloco, sendo assim o anterior não tem o valor alterado por esse atribuiçãolettest='valor if';console.log(`Valor dentro do if "${test}"`);}console.log(`Valor após a execução do if "${test}"`);})();
//2-3-variaveis.js(()=>{consttest='valor função';console.log(`Valor dentro do função "${test}"`);if(true){consttest='valor if';console.log(`Valor dentro do if "${test}"`);}console.log(`Valor após a execução do if "${test}"`);})();
//3-variaveis.js//Se for uma const do tipo primitivo,constname='Daniel';//não podemos alterar o valor,name='Daniel';constuser={name:'Daniel'};//mas se for um objeto, podemos trocar suas propriedadesuser.name='Outro nome'//não podemos fazer o objeto "apontar" para outro lugaruser={name:'Guilherme'};constpersons=['Daniel','Pedro','Jennifer'];//podemos adicionar novos itenspersons.push('João');//result ['Daniel', 'Pedro', 'Jennifer', 'João']//podemos remover algum itempersons.shift();//result ['Pedro', 'Jennifer', 'João']//podemos alterar diretamentepersons[1]='James';//result ['Pedro', 'James', 'João']//mas não podemos "apontar" para outro arraypersons=[]console.log('\nArray após as alterações: ',persons);
- Autor: Guilherme Cabrini da Silva
- Origem: Digital Innovation One
- string
- number
- boolean
- null
- undefined
- symbol
- Object
- Function
- Array
//1-string.js//retorna o tamanho de uma stringconsttextSize='Texto'.length;console.log(`Quantidade de letras:${textSize}`)//retorna um array quebrando a string por um delimitadorconstsplittedText='Texto'.split('x');console.log('\nArray com as posições separadas pelo delimitador: ',splittedText);//busca por um valor e substitui por outroconstreplacedText='Texto'.replace('Text','txeT');console.log('\nSubstituição de valor: ',replacedText);//retorna a "fatia" de um valorconstlastChar='Texto'.slice(-1);console.log('\nÚltima letra de uma string: ',lastChar);constallWithoutLastChar='Texto'.slice(0,-1);console.log('\nValor da string da primeira letra menos a última: ',allWithoutLastChar);constsecondToEnd='Texto'.slice(1);console.log('\nValor da string da segunda letra até a última: ',secondToEnd);//retorna N caracteres a partir de uma posiçãoconsttwoCharsBeforeFirstPosition='Texto'.substr(0,2);console.log('\nAs duas primeiras letras são : ',twoCharsBeforeFirstPosition);
//1-number.jsconstmyNumber=12.4032;//transformar número para stringconstnumberAsString=myNumber.toString();console.log('Número trasnformado em string: ',numberAsString,typeofnumberAsString);//retorna número com um número de casas decimaisconstfixedTwoDecimals=myNumber.toFixed(2);console.log('\nNúmero com duas casa decimais: ',fixedTwoDecimals);//transforma uma string em floatconsole.log('\nString convertida para float: ',parseFloat('13.22'));//transforma uma string em intconsole.log('\nString convertida para int: ',parseInt('13.20'));
//1-boolean.jsconstisActive=true;console.log('Tipo de variável :',typeofisActive)
//1-null.jsconstnullVariable=null;console.log('nullVariable :',typeofnullVariable)
//1-undefined.jsconstundefinedVariable=true;console.log('Tipo de variável :',typeofundefinedVariable)
//1-symbol.jsconstsymbol1=Symbol();constsymbol2=Symbol();//symbols são únicosconsole.log('symbols1 é igual a symbols2: ',symbol1===symbol2);//prevenir conflito entre nomes de propriedadesconstnameSymbol1=Symbol('name');constnameSymbol2=Symbol('name');constuser={[nameSymbol1]:'Daniel',[nameSymbol2]:'Outro nome',lastName:'Negrisoli Batista'}console.log(user);//symbols criam propriedades que não são enuberablesfor(constkeyinuser){if(user.hasOwnPoperty(key)){console.log(`\nValor da chave${key}:${user[key]}`);}}console.log('Propriedades do objeto user: ',Object.keys(user));console.log('Valores das propriedades do objeto user: ',Object.values(user));//exibir symbols de um objetoconsole.log('Symbols registrados no objeto user: ',Object.getOwnPropertySymbols(user));//acessando todas as propriedades do objetoconsole.log('Todas propriedads do objeto user: ',Reflect.ownKeys(user));//criar um enumconstdirections={UP:Symbol('UP'),DOWN:Symbol('DOWN'),LEFT:Symbol('LEFT'),RIGHT:Symbol('RIGHT')};
//1-object.jsletuser={name:'Daniel'};console.log(user);//alterando a propriedade de um objetouser.name='Outro nome 1';console.log(user);user['name']='Outro nome 2';console.log(user);constprop='name';user[prop]='Outro nome 3';console.log(user);//criando uma propriedadeuser.lastName='Negrisoli Batista';console.log(user);//deletando uma propriedadedeleteuser.name;console.log(user);
//2-object.jsletuser={name:'Daniel',lastName:'Negrisoli Batista'};//recupera as chaves do objetoconsole.log('Propriedades do objeto user: ',Object.keys(user));//recupera os valores das chaves do objetoconsole.log('\Valores das propriedades do objeto user: ',Object.values(user));//retorna um array de arrays contendo [nome.prop, valor.prop]console.log('\Lista de propriedades e valores: ',Object.entries(user));//merge de propriedades de objetosObject.assign(user,{fullName:'Daniel Negrisoli Batista'});console.log('\nAdiciona a propriedade fullName no objeto user: ',user);console.log('\Retorna um novo objeto mergeando dois ou mais objetos: ',Object.assign({},user,{age:36}));//previne todas as alterações em um objetoconstnewObj={foo:'bar'};Object.freeze(newObj);newObj.foo='change';deletenewObj.foo;newObj.bar='foo';console.log('\nVariável newObj após as alterações: ',newObj);//permite apenas a alteração de propriedades existetnes em um objetoconstperson={name:'Daniel'};Object.seal(person);person.name='Daniel Negrisoli Batista';deleteperson.name;person.age=36;console.log('\nVariável person após as alterações: ',person);
//1-function.jsfunctionfn(){return'Code here';}constarrowFn=()=>'Code here';constarrowFn2=()=>{//mais de uma expressãoreturn'Code here';}//funções também são objetosfn.prop='Posso criar propriedades';console.log(fn());console.log(fn.prop);//receber parâmetrosconstlogValue=value=>console.log(value);constlogFnResult=fnParam=>console.log(fnParam());logFnResult(fn);//receber e retorna funçõesconstcontrolFnExec=>fnParam=>allowed=>{if(allowed){fnParam();}}consthandleFnExecution=controlFnExec(fn);handleFnExecution(true);//executará a função fnhandleFnExecution();//não executará a funçao fn//controlFnExec como funçãofunctioncontrolFnExec(fnParam){returnfunction(allowed){if(allowed){fnParam();}}}
//2-function.js(()=>{this.name='Nome no contexto de criação';constgetNameArrowFn=()=>this.name;functiongetName(){returnthis.name;}constuser={name:'Nome no objeto de execução', getNameArrowFn, getName}console.log(user.getNameArrowFn());console.log(user.getName());})();
//1-array.jsconstusers=['Daniel','Pedro','Jennifer'];constgender={MAN:Symbol('M'),WOMAN:Symbol('W')}constpersons=[{name:'Daniel',age:35,gender:gender.MAN},{name:'Pedro',age:44,gender:gender.MAN},{name:'Jennifer',age:18,gender:gender.WOMAN}];//retornar a quantidade de itens de um arrayconsole.log('Items: ',persons.length);//verificar se pe arrayconsole.log('A variável person é um array: ',Array.isArray(persons));//iterar os itens do arraypersons.forEach(person,index,arr=>{console.log(`Nome:${person.name} index:${index}`);});//filtrar arrayconstmens=persons.filter(person=>person.gender===gender.MAN);console.log('\nNova lista apenas com homens: ',mens);//retornar um novoconstpersonWithCourse=persons.map(person=>{person.course='Introdução ao Javascript';returnperson;});console.log('\nPessoal com a adição do curso: ',personWithCourse);//transformar um array em outro tipo (primeiro param é o novo item, o segundo param é o item do array)consttotalAge=persons.reduce((age,person)=>{age+=person.age;returnage;},0);console.log('\nSoma de idade das pessoas: ',totalAge);//justando operaçõesconsttotalEvenAges=persons.filter(person=>person.age%2===0).reduce((age,person)=>{age+=person.age;returnage;},0);console.log('\nSoma de idade das pessoas que possuem idade par: ',totalEvenAges);
//1-artimeticos.js//módulo (%)//operador binário. retorna o inteiro restante da divisão dos dois operadores12%5// retorna 2//incremento (++) e decremento (--)++xx++--xx--//negação (-) adição (+)-3+"3"//retorna 3+true//retorna 1+false//retorna 0-true//retorna -1//operador de exponenciação (**)2**3//retorna 810**-1//retorna 0.1//operador de agrupamento ()2*(3+2)
//1-atribuicao.js//atribuiçãox=y//atribuição de adiçãox=x+y//oux+=y//atribução de subtraçãox=x-y//oux-=y//atribuição de multiplicaçãox=x*y//oux*=y//atribuição de divisãox=x/y//oux/=y//atribuição de restox=x%y//oux%=y
//1-comparacao.js//igual (==)//retorna verdadeiro caso os operandos sejam iguais. 3 == var1"3"==var13=='3'//não igual (!=)//retorna verdadeiro caso os operandos não sejam iguais. var1 != 4var2!="3"//estritamente igual (===)//retorna verdadeiro caso os operando sejam iguais e do mesmo tipo. Veja támbem Object.3===var1//estritamente não igual (!===)//retorna verdadeiro caso os operandos não sejam iguais e/ou não sejam do mesmo tipovar1!=="3"3!=='3'//maior que (>)//retorna verdadeiro caso o operando da esquerda seja maior que o da direitavar2>var1"12">2//maior que ou igual (>=)//retorna verdadeiro caso o operando da esquerda seja maior ou igual ao da direitavar2>=var1var1>=3//menor que (<)//retorna verdadeiro caso o operando da esquerda seja menor que o da direita.var1<var2"12"<"2"//menor que ou igual (<=)//retorna verdadeiro caso o operando da esquerda seja menor ou igual ao da direitavar1<=var2var2<=5
//1-condicional.js//ternáriocondicao ?valor1 :valor2true ?'foo' :'bar'//retorna 'foo'false ?'foo' :'bar'//retorna 'bar'
//1-logicos.jsexp1&&exp2//AND lógico (&&)vara1=true&&true//retorna truevara2=true&&false//retorna falsevara3=false&&true//retorna falsevara4=false&&(3==4)//retorna falsevara5="Gato"&&"Cão"//retorna Cãovara6=false&&"Gato"//retorna falsevara7="Gato"&&false//retorna false//OU lógico (||)exp1||exp2varo1=true||true//retorna truevaro2=false||true//retorna truevaro3=true||false//retorna truevaro4=false||(3==4)//retorna falsevaro5="Gato"||"Cão"//retorna Gatovaro6=false||"Gato"//retorna Gatovaro7="Gato"||false//retorna Gato//exemplo para atribuição de variávelconteudo=conteudo||'fallback';//NOT lógico (!)!exp1varn1=!true//retorna falsevarn2=!false;//retorna truevarn3=!"Gato";//retorna false (string com valor é verdadeira)//String com valor e sem valor//True" "//False""
//1-unarios.js//deletar algodeletesomething;//determinar o tipo//O typeof é um operador unário que retorna em um string indicando um tipo de operando.typeofsomething;
//2-binarios.js//insomethinginsomethingItems//arraysvararvores=newArray("pau-brasil","loureiro","cedro","carvalho","sicômoro");0inarvores;//retorna true3inarvores;//retorna true6inarvores;//retorna false"cedro"inarvores//retorna false (você deve especificar o número do índice),//não o valor naquele índice"cedro"inarvores[2]//retorna true"length"inarvores//retorna true (length é uma propriedade de Array)//objetos predefinidos"PI"inMath;//retona truevarminhaString=newString("coral");"length"inminhaString;//retorna true//objetos personalizadosvarmeuCarro={marca:"Honda",modelo:"Accord",ano:1998};"marca"inmeuCarro;//retorna true"modelo"inmeuCarro//retorna true//instanceofobjetoinstanceoftipoObjetovardia=newDate(2020,4,13);if(diainstanceofDate){//code here}
//1-spread.js//spread ...varpartes=['ombro','joelhos'];varmusica=['caceca', ...partes,'e','pés'];functionfn(x,y,x){}varargs=[0,1,2];fn(...args);
//1-if.js/*if (condition) { //code}*/constarray=[0,1,2,3,4,5];array.forEach(item=>{if(item%2===0){console.log(`O número${item} é par`);}else{console.log(`o número${item} é impar`);}});
//1-esle-if.js/*if (condidtion) { //code} else if (condition) { //code}*/constarray=[2,3,4,5,6,8,10,15];array.forEach(item=>{if(item%2===0){console.log(`O número${item} é divisível por 2`);}elseif(item%3===0){console.log(`o número${item} é divisível por 3`);}elseif(item%5===0){console.log(`o número${item} é divisível por 5`);}});
//1-switch.js/*switch (expression) { case valor1: [break;] case valorN: [break;] default: [break;]}*/constfruit='pera';switch(fruit){case'banana':console.log('R$ 3,00 / KG')break;case'mamão':case'pera':console.log('R$ 2,00 / KG')break;default:console.log('Produto não existe no estoque');break;}
//1-for.js/*for ([expressaoInicial]; [condicao]; [incremento]) { //code}*/constarray=['one','two','three'];for(letindex=0;index<array.length;index++){constelement=array[index];console.log(`Element #${index}:${element}`);}
//1-for-in-of.jsletarr=[3,5,7];arr.foo="hello";//for-in - imprime indices do arrayfor(letiinarr){console.log(i);//0, 1, 2, foo}//for-of - imprime valores do arrayfor(letiofarr){console.log(i);//3, 5, 7}
//1-while.js/*while(condicao) {code}*/varn=0;varx=0;while(n<3){n++;x+=n;//1, 3, 6}console.log(x);
//1-do-while.js/*do codewhile(condicao);*/leti=0;do{i+=1;console.log(i);}while(i<5);
//1-controle-repeticao.js//breakconsole.log('Exemplo de utilização de break');varindex=0;while(true){index++;if(index>2){break;}console.log(index);}//continueconsole.log('\nExemplo de utilização de continue');constarray=[1,2,3,4,5,6];for(letindex=0;index<array.length;index++){constelement=array[index];if(element%2===0){continue;}console.log(element);}
- Autor: Guilherme Cabrini da Silva
- Origem: Digital Innovation One
Herança é baseada em protótipos, onde é utilizada aparece o tipo prototype, toda vez que é criada uma variável no javascript é criado um referênciaproto que aponta para o prototype do tipo que criamos, esse tipo é o constructor. Baseado em um constructor é criado um prototype e nessa variável é armazenada a referênciaproto
- baseadas em protótipos
- prototype
- proto
- constructor
'use strict';constmyText='Hello prototype!';console.log(myText.split(''));//<-- de onde vem o split?constmyText2=String('Hello prototype!');console.log(myText2.__proto__.split)//<-- quando é criado uma string é utilizado a função construtora String, essa função construtora carrega um prototype, e toda vez que é criado uma variável utilizando uma função construtora é criada uma referência __proto__ .
O que ocorre no javascript ao utilizarnew?
newFoo(...);
- Um novo objeto é criado, herdando Foo.prototype;
- A função construtora Foo é chamda com os argumentos específicados e com othis vínculado ao novo o obejto criado;
- Caso a função construtora tenha um retorno explíctio, será respeitado o seureturn, senão, será retornado o objeto criado no passo 1.
//1-heranca.js//exemplo simples de herança, onde um construtor chama o outrofunctionAnimal(quatidadePatas){this.quatidadePatas=quatidadePatas;}functionCachorro(morde){Animal.call(this,4);this.morde=morde;}constpug=newCachorro(false);console.log(pug);//Cachorro {quatidadePatas: 4, morde: false}
- ES6
- simplificação da herança de protótipos
- palavra chaveclass
//1-classes.js'use strict';classAnimal{constructor(quatidadePatas){this.quatidadePatas=quatidadePatas}}classCachorroextendsAnimal{constructor(morde){super(4);this.morde=4;}}constpug=newCachorro(false);console.log(pug);//Cachorro {quatidadePatas: 4, morde: false}
- Javascript não tem, no Node 12 haverá.
- privado / público
//1-modificadores-de-acesso.js'user script';/*//como functionfunction Person(initialName) { let name = initialName; this.getName = function() { return name } this.setName = function(newName) { name = newName; }}*///versão 12classPerson{ #name='';constructor(initialName){this.#name=initialName;}getName=function(){returnthis.#name}setName=function(newName){this.#name=newName;}}constp=newPerson('Daniel');console.log(p)//Person {getName: f, setName: f}p.getName();//danielp.name;//undefinedp.setName('Thiago');p.getName();//Thiago
- Oculta detalhes do funcionamento interno
//1-encapsulamento.js'use strict';//funções/*function Person(initialName) { var name = initialName; Object.defineProperty(this, 'name', { get: function() { return name; }, set: function(value) { name = value; } });}*/classPerson{ #name='';constructor(name){this.#name=name;}getname(){returnthis.#name}setname(name){this.#name=name;}}
- Acessar métodos/atributos sem instanciar
//1-static.js'use strict';/*//functionfunction Person() {}Person.walk = function() { console.log('walking...');}console.log(Person.walk());//walking...*/classPerson{staticwalk(){console.log('walking..');}}console.log(Person.walk());//walking...
Design Patterns ou padrões de projetos são soluções generalistas para problemas reccorentes durante o desenvolvimento de um software. Não se trata de um framework ou código pronto, mas de uma definição de alto nível de como um problema comum pode ser solucionado.
- 1978
- Christopher Alexander, Sara Ishikawa e Murray Silverstein.
- 253 tipos de problemas/desafios de projetos
- Nome
- Exemplo
- Contexto
- Problema
- Solução
- 1987
- Kent Beck e Ward Cunningham
- 5 padrões de projeto
- 1994
- Gang of four (GoF)
- Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides
Os padrões de criação são aqueles que abstraem e/ou adiam o processo de criação dos objetos. Eles ajudam a tornar um sistema independente de como seus objetos são criados, compostos e representados.
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
Os padrões estruturais se preocupam com a forma como classes e objetos são compostos para forma estrutura maiores.
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Business Delegate
- Flyweight
- Proxy
Os padrões de comportamento se concentram nos algoritmos e atribuições de responsabilidades entre os objetos. Ele não descrevem apenas padrões de objetos ou de classes, mas também os padroes de comunicação entre os objetos.
- Chain of Responsability
- Command
- Interpreter
- Iterator
- Mediator
- Observer
- State
- Strategy
- Template Method
- Visitor
Todas as funções que retornam um objeto, sem a necessidade de chamá-las com o new, são considerasd funçõesFactory.
//1-factory.js//Todas as funções que retornam um objeto, sem a necessidade de chamá-las com o new, são considerasd funções *Factory*.functionPessoa(customProperties){return{name:'Daniel',lastName:'Negrisoli Batista', ...customProperties}}// Factoryconstpessoa=Pessoa({name:'Custom Name',age:35});console.log(pessoa);
O objetivo desse pattern é criar uma única instância de uma função construtora e retorná-la toda vez que for necessário utilizá-la.
//2-singleton.jsvarSETTINGS={api:'http://localhost',trackJsToken:'12345'}//retorna Pessoa.instance quando instanciado, caso contrario instancia e depois devolvefunctionPessoa(){if(!Pessoa.instance){Pessoa.instance=this;}returnPessoa.instance}constpessoa=Pessoa.call({name:'Daniel'});constpessoa2=Pessoa.call({name:'Custom Name'});console.log(pessoa);console.log(pessoa2);
Uma função decorator recebe uma outra função como parâmetro e estende o seu comportamento sem modificá-la explicitamente.
//3-decorator.js//funçãoletloggedIn=false;functioncallIfAuthenticated(fn){return!!loggedIn&&fn();}functionsum(a,b){returna+b;}console.log(callIfAuthenticated(()=>sum(2,3)));//só executa se logadologgedIn=true;console.log(callIfAuthenticated(()=>sum(2,3)));loggedIn=false;console.log(callIfAuthenticated(()=>sum(2,3)));
É um pattern muito popular em aplicações javascript. A instância (subscriber) mantém uma coleção de objetos (observers) e notifica todos eles quando ocorrem mudanças no estado.
//4-observer.jsclassObservable{constructor(){this.observables=[];}subscribe(fn){this.observables.push(fn);}notify(data){this.observables.forEach(fn=>fn(data));}unsubscribe(fn){this.observables=this.observables.filter(obs=>obs!==fn);}}consto=newObservable();constlogData1=data=>console.log(`Subscribe 1:${data}`);constlogData2=data=>console.log(`Subscribe 2:${data}`);constlogData3=data=>console.log(`Subscribe 3:${data}`);o.subscribe(logData1);o.subscribe(logData2);o.subscribe(logData3);o.notify('notified 1');o.unsubscribe(logData2);o.notify('notified 2');
É um pattern que possibilita organizarmos melhor o nosso código necessidade de expor variáveis globais.
//5-module.jsletname='default';functiongetName(){returnname;}functionsetName(newName){name=newName;}module.exports={ getName, setName};//6-module-import.jsconst{getName, setName}=require('./5-module.js');console.log(getName());console.log(setName('Daniel'));console.log(getName());
De acordo com o código abaixo, as alternativas corretas são:
functionPessoa(nome,idade){this.nome=nome;this.idade=idade;return{ nome,idade:20,falar(){console.log('objeto falar');}}}Pessoa.prototype.falar=function(){console.log('prototype falar');};constpessoa=newPessoa('Foo',30);
Com base no código acima, observe as afirmativas abaixo:
I - O retorno será um objeto "{ nome: 'Foo', idade: 20 }". Pois mesmo chamando a função Pessoa com a palavra-chave new, a função possui retorno explicito.
II - A expressão "pessoa.constructor === Pessoa" retornará true. Pois como utilizamos a palavra-chave new, sempre será retornado uma instância de pessoa, mesmo quando a função possui retorno explícito.
III - A expressão "pessoa.constructor === Object" retornará true. Pois o retorno da função é um objeto.
IV - A expressão "pessoa.proto.falar === undefined" retornará true. Pois como há retorno explícito de um objeto na função Pessoa, suas definições não são passadas a esse objeto.
V - Executando a função "pessoa.falar()" será logado no console o texto 'prototype falar'.
R: I, III, IV
Analise a classe abaixo e seleciona a alternativa em que todas as afirmações são corretas:
classID{static #contador=0;staticgetcontador(){returnthis.#contador;}staticincrementaContador(){return++this.#contador;}}classCliente{ #id=0;constructor(){this.#id=ID.incrementaContador();}getid(){returnthis.#id;}}constc1=newCliente();console.log(`Contador atual:${ID.contador}.`);constc2=newCliente();constc3=newCliente();console.log(`Contador atual:${ID.contador}.`);
As afirmativas abaixo são:
I - É possível chamar o método "incrementaContador" sem instanciar a classe ID pois o método possui a palavra-chave static.
II - A saídas dos console.log são respectivamente: "Contador atual: 1." e "Contador atual: 3.".
III - É possível instanciar a classe ID mas sua instancia não herdará os atributos/métodos com a palavra-chave static.
IV - Quando uma função possui todos os atributos/métodos static não é possível chamá-la com a palavra-chave new.
V - Métodos que possuem a palavra-chave static, só podem ser chamados por outros métodos static.
R: I, II, III
De acordo com o código abaixo, selecione a alternativa em que todas as comparações retornam true:
constname='Foo';constlastName=String('Bar');
I - name.constructor === lastName.constructor
II - name.prototype === String.prototype
III - lastName.proto === String.prototype
IV - name.proto.split === lastName.proto.split
R: I, III, IV
Analise o código abaixo:
functionConta(){}Conta.prototype.rendimento=0;Conta.prototype.depositar=function(){}Conta.prototype.retirar=function(){}Conta.prototype.exibirSaldo=function(){return`O saldo da conta é:${this.saldo}.`;}functionContaPoupanca(){this.exibirSaldo=function(){return'Operação não disponível';}}ContaPoupanca.prototype.rendimento=0.03;ContaPoupanca.prototype=Object.create(Conta.prototype);constcontaPoupanca=newContaPoupanca();
Agora avalie as afirmativas abaixo e assinale a alternativa que apresenta as corretas:
I - A variável "contaPoupanca" será uma instância de ContaPoupanca, ou seja, a expressão "contaPoupanca instanceof ContaPoupanca" retornará true.
II - A variável "contaPoupanca" possuíra os métodos "depositar", "retirar" e "exibirSaldo". Mas a implementação da função "exibirSaldo" não será sobrescrita, pois não é possível sobrescrever propriedades de um prototype.
III - O retorno da função "contaPoupanca.exibirSaldo()" será: "O saldo da conta é: undefined.".
IV - O valor do atributo "rendimento" da variável "contaPoupanca" será 0.3.
V - O retorno da função "contaPoupanca.proto.exibirSaldo()" será: "O saldo da conta é: undefined.".
R: I, V
Analisando o código abaixo, quais serão as saídas dos console.log:
functionPessoa(nome){this.nome=nome;}functionPessoaFisica(nome,cpf){Pessoa.call(this,nome);this.cpf=cpf;}functionPessoaJuridica(nome,cnpj){Pessoa(nome);this.cnpj=cnpj;}constpessoaFisica=newPessoaFisica('Foo','123.456.670-0');constpessoaJuridica=newPessoaJuridica('Bar','12.345.678/9012-34');console.log(pessoaFisica);console.log(pessoaJuridica);
R: 'PessoaFisica {nome: "Foo", cpf: "123.456.670-0"}' e 'PessoaJuridica {cnpj: "12.345.678/9012-34"}'.
No código abaixo as funções "adicionaUsuarioLogado" e "executaSeUsuarioEstaLogado" são exemplos de qual pattern:
functionadicionaUsuarioLogado(fn){constusuarioLogado={nome:'Foo',sobrenome:'Bar'};fn(usuarioLogado);}functionexecutaSeUsuarioEstaLogado(usuarioLogado,fn){if(!usuarioLogado){console.log('Usuário não está logado.');return;}fn();}functionnotificaUsuarioLogado(usuarioLogado){console.log(`Bem-vindo usuário${usuarioLogado.nome}!`);}adicionaUsuarioLogado(usuarioLogado=>executaSeUsuarioEstaLogado(usuarioLogado,()=>{notificaUsuarioLogado(usuarioLogado);}));
R: Decorator.
Analise as funções abaixo e selecione a alternativa em que todas são consideradas Factory:
I-functionexibeNome(nome){console.log(nome);}II-functionPessoa(nome){this.nome=nome;}III-functionPessoa(nome){return{ nome};}IV-functionrecuperaDadosFormulario(formulario){if(!formulario){return{};}constdados={nome:formulario.nome,idade:formulario.idade};returndados;}V-functionsetNome(nome){this.nome=nome;}
R: III, IV
Na versão 12 do nodejs é possível que uma classe possua propriedades privadas aplicando um prefixo "#" no nome de seus atributos e métodos. Analise a classe abaixo e selecione a informação que possui o que será exibido pelos "console.log" respectivamente:
classPessoa{ #nome='';constructor(nome){this.#nome=nome;}getnome(){return`Seu nome é:${this.#nome}.`;}setnome(novoNome){this.#nome=novoNome;}}constpessoa=newPessoa();console.log(pessoa);console.log(pessoa.nome);pessoa.nome='Foo';console.log(pessoa.nome);
R: "Pessoa {#nome: "Foo"}", "Seu nome é: undefined." e "Seu nome é: Foo."
- Autor: Guilherme Cabrini da Silva
- Origem: Digital Innovation One
//1-criando-arrays.jsconstarr=[1,2,3];constarr2=newArray(1,2,3);console.log(arr)console.log(arr2)
Cria uma nova instância de array a partir do número de parâmetros informados.
//1-criando-arrays.jsconstarr3=Array.of(1,2,3);console.log(arr3)
Cria uma nova instância de array de acordo com os parâmetros informados
//1-criando-arrays.jsconstarr4=Array(3);console.log(arr4)// [empty x 3]constarr5=Array(3,2);console.log(arr5)// [3, 2]
Cria uma nova instância de array a partir de um parâmetro array-like ou iterable object
//1-criando-arrays.js//node listconstdivs=document.querySelectetorAll('div');//converte para arrayconstarr6=Array.from(divs);console.log(arr6)
Adiciona um ou mais elementos no final do array e retorna o tamanaho do novo array
//2-inserir-remover-elementos-arrays.jsconstarr1=['banana','melancia','abacate'];constarr1Length=arr1.push('acerola');console.log(arr1Length)//4console.log(arr1)//['banana', 'melancia', 'abacate', 'acerola']
Remove o último elemento de um array e retorna o elemento removido
//2-inserir-remover-elementos-arrays.jsconstarr2=['banana','melancia','abacate'];constremovedItem=arr2.pop();console.log(removedItem);//abacateconsole.log(arr2)//['banana', 'melancia'];
Adiciona um ou mais elementos no início do array e retorna o tamanho do novo array
//2-inserir-remover-elementos-arrays.jsconstarr3=['banana','melancia','abacate'];constarr3Length=arr2.unshift('acerola');console.log(arr1Length)//4console.log(arr1)//['acerola', 'banana', 'melancia', 'abacate']
Remove o primeiro elemento de um array e retorna o elemento removido
//2-inserir-remover-elementos-arrays.jsconstarr4=['banana','melancia','abacate'];constremovedItemArr4=arr4.pop();console.log(removedItemArr4);//bananaconsole.log(arr4)//['melancia', 'abacate'];
Concatena um ou mais arrays retornando um novo array
//2-inserir-remover-elementos-arrays.jsconstarr5=['banana','melancia','abacate'];constarr6=['coxinha','kibe','empada'];constarr7=arr5.concat(arr6);console.log(arr7)//['banana', 'melancia', 'abacate', 'coxinha', 'kibe', 'empada']
Retorna um novo array "fatiando" o array de acordo com o início e fim
//2-inserir-remover-elementos-arrays.jsconstarr8=['banana','melancia','abacate','acerola','laranja'];//retorna de-atéconsole.log(arr8.slice(0,2));//['banana', 'melancia']//retorna a partir deconsole.log(arr8.slice(2));//['abacate', 'acerola', 'laranja']//realiza o mesmo procedimento do a partir de porém ao contrárioconsole.log(arr8.slice(-1));//['laranja']//realiza o mesmo procedimento do a partir de porém ao contrárioconsole.log(arr8.slice(-3));//['abacate', 'acerola', 'laranja']
Altera um array adicionando novos elementos enquanto remove elementos antigos
//2-inserir-remover-elementos-arrays.jsconstarr9=[1,2,3,4,5];//remove os elementos do array original a partir dearr9.splice(2);//[3, 4, 5]console.log(arr9);//[1, 2]//é possível remover e adicionar ao mesmo tempo//nesse exemplo, na posição 0, remove 0 elementos, adiciona o item 'first'arr9.splice(0,0,'first');//retorno é sempre os elementos removidos//[]console.log(arr9);//["first", 1, 2]
Iteração de cada item dentro de um array
//3-iterar.jsconstarr1=[1,2,3,4,5];//forEach//Iteração de cada item dentro de um arrayarr1.forEach((value,index)=>{console.log(`${index}:${value}`);});
Retorna um novo array, de mesmo tamanho, iterando cada item de um array
//3-iterar.jsconstarr2=[1,2,3,4,5];constarrMap=arr2.map(value=>value*2);console.log(arrMap)
Retorna um novo array com todos os elementos de um sub-array concatenados de forma recursiva de acordo com a profundidade especificada(depth)
//3-iterar.jsconstarr3=[20,34,[35,60,[70,40]]];//recebe como parametro a profundidadeconstarrFlat=arr3.flat(2)
Retorna um novo array assim como a função map e executa um flat de profundidade 1
//3-iterar.jsconstarr4=[1,2,3,4,5];constarrFlatMap=arr4.flatMap(value=>[value*2]);console.log(arrFlatMap);//[2, 4, 6, 8]
Retorna um Array Iterator que contém as chaves para cada elemento do array.
//3-iterar.jsconstarr5=[1,2,3,4];constarrIterator=arr.keys();arrIterator.next();//{value: 0, done: false}arrIterator.next();//{value: 1, done: false}arrIterator.next();//{value: 2, done: false}arrIterator.next();//{value: 3, done: true}
Retorna um Array Iterator que contém os valores para cada elemento do array
//3-iterar.jsconstarr6=[1,2,3,4];constarrIterator=arr.values();arrIterator.next();//{value: 1, done: false}arrIterator.next();//{value: 2, done: false}arrIterator.next();//{value: 3, done: false}arrIterator.next();//{value: 4, done: true}
Retorna um Array Iterator que contém os pares chave/valor para cada elemento do array
//3-iterar.jsconstarr6=[1,2,3,4];constarrIterator=arr.entries();arrIterator.next();//{value: [0, 1], done: false}arrIterator.next();//{value: [1, 2], done: false}arrIterator.next();//{value: [2, 3], done: false}arrIterator.next();//{value: [3, 4], done: true}
Retorna o primeiro item de um array que satisfaz a condição
//4-buscar.js//find//Retorna o primeiro item de um array que satisfaz a condiçãoconstarr=[1,2,3,4];constfirstGreatThanTwo=arr.find(value=>value>2);console.log(firstGreatThanTwo);
Retorna o índice do primeiro item de um array que satisfaz a condição
//4-buscar.jsconstarr2=[1,2,3,4];constfirstGreatThanTwo2=arr2.findIndex(value=>value>2);console.log(firstGreatThanTwo2);//2
Retorna um novo array com todos os elementos que satisfazem a condição
//4-buscar.jsconstarr3=[1,2,3,4];constallValuesGreatThanTwo=arr3.findIndex(value=>value>2);console.log(allValuesGreatThanTwo);//[3, 4]
Retorna o primeiro índice em que um elemento pode ser encontrado no array
//4-buscar.jsconstarr4=[1,2,3,4];constfirstIndexOfItem=arr4.indexOf(3);console.log(firstIndexOfItem);//1
Retorna o último índice em que um elemento pode ser encontrado no array
//4-buscar.jsconstarr4=[1,2,3,4];constlastIndexOfItem=arr4.lastIndexOf(3);console.log(lastIndexOfItem);//4
Retorna um booleano verificando se determinado elemento existe no array
//4-buscar.jsconstarr5=[1,3,3,4,3]consthasItemOne=arr5.includes(1);//trueconsthasItemTwo=arr5.includes(2);//false
Retorna um bolleano verificando se pelo menos um item do array satisfaz a condição.
//4-buscar.jsconstarr6=[1,3,3,4,3];consthasSomeEvenNumber=arr6.some(value=>value%2===0);//true
Retorna um bolleano verificando se todos os itens de um array satisfazem a condição
//4-buscar.jsconstarr7=[1,3,3,4,3];constallEvenNumbers=arr7.some(value=>value%2===0);//false
Ordena os elementos de um array de acordo com a condição
//5-ordenar.jsconstarr8=[{name:'John',grade:7},{name:'Jenny',grade:5},{name:'Peter',grade:4}];console.log(arr8.sort((curret,next)=>next.grade-curret.grade));//[{name: 'John', grade: 7}, {name: 'Jenny', grade: 5}, {name: 'Peter', grade: 4}]
Inverte os elementos de um array
//5-ordenar.jsconstarr9=[1,2,3,4,5]console.log(arr.reverse());//[5, 4, 3, 2, 1]
Junta todos os elementos de um array, separados por um delimitador e retorna uma string
//6-transformar-dados.jsconstarr10=[1,2,3,4,5];console.log('-');//"1-2-3-4-5"
Retorna um novo tipo de dado iterando cada posição de um array
//6-transformar-dados.jsconstarr2=[1,2,3,4,5]console.log(arr2.reduce((total,value)=>total+=value,0));//15constarr3=[{name:'John',grade:7},{name:'Jenny',grade:5},{name:'Peter',grade:4}];//média simples com reduceconsole.log(arr3.reduce((totalGrades,student)=>totalGrades+=student.grade,0)/arr3.length);//5.33console.log(arr3.reduce((studentsNames,student)=>studentsNames+=student.name+' ',''));//John Jenny Peter
Assinale a alternativa que possui todas as formas possíveis de criar um array em que seu primeiro elemento possua o valor 2 (tipo int):
I-[2];II-Array.from(2);III-Array.of(2);IV-Array(2);V-newArray(2);
R: I, III
Analise o código abaixo e assinale a alternativa que representa os valores corretos que serão exibidos nos console.log respectivamente:
constfamiliaPai=["Avó Zeca","Avô Aroldo"];constfamiliaMae=["Avô Carlos","Primo João Paulo"];constfamiliaFilho=familiaPai.concat(familiaMae);console.log(familiaPai);console.log(familiaMae);console.log(familiaFilho);
R: ["Avó Zeca", "Avô Aroldo"], ["Avô Carlos", "Primo João Paulo"] e ["Avó Zeca", "Avô Aroldo", "Avô Carlos", "Primo João Paulo"]
Analise o código abaixo e assinale a alternativa que representa os valores corretos que serão exibidos no console.log respectivamente:
constpessoas=["Cris","Alexandre","Pablo","Cris"];console.log(pessoas.indexOf("Cris"));console.log(pessoas.findIndex(nome=>nome==="Cris"));console.log(pessoas.lastIndexOf("Cris"));console.log(pessoas.find(nome=>nome==="Cris"));
R: 0, 0, 3, "Cris"
Assinale a alternativa que possui o valor retornado pela função flat:
constfrutas=["amora",["laranja",["melancia"],"acerola"]];console.log(frutas.flat(2));
R: ["amora", "laranja", "melancia", "acerola"]
Analise o código abaixo e selecione a alternativa que possui as formas possíveis de se remover o item "acerola" alterando o array "frutas":
constfrutas=["melancia","laranja","acerola"];I-frutas.shift();II-frutas.pop();III-frutas.splice(2,1);IV-frutas.slice(2,1);V-frutas.unshift();
R: II e III.
Analise o código abaixo e assinale a alternativa que possui o valor da variável "colaboradoresComSalario":
constcolaboradores=[{nome:"Cris",horasTrabalhadas:220},{nome:"Rebeca",horasTrabalhadas:210}];functionadicionaSalario(colaborador){constsalario=colaborador.horasTrabalhadas*50;colaborador.salario=salario;return{salario:salario};}constcolaboradoresComSalario=colaboradores.map(adicionaSalario);console.log(colaboradoresComSalario);
R: [{salario: 11000}, {salario: 10500}]
De acordo com o código abaixo, o que será exibido no console.log:
constperson=["Cris"];person.push("James","Jenny");person.push("John");console.log(person);
R: ["Cris", "James", "Jenny", "John"]
Analise o código abaixo e assinale a alternativa que representa os valores corretos que serão exibidos nos console.log respectivamente:
constalunos=[{nome:"Cris",nota:10},{nome:"Alexandre",nota:7},{nome:"Pablo",nota:4}];functionalunoAprovado(aluno){returnaluno.nota>=7;}console.log(alunos.filter(alunoAprovado));console.log(alunos.some(alunoAprovado));console.log(alunos.every(alunoAprovado));
R: [{ nome: "Cris", nota: 10 }, { nome: "Alexandre", nota: 7 }], true, false
Analise o código abaixo e selecione a alternativa que possui o valor do array frutas após a execução das funções sort e reverse:
constfrutas=["amora","laranja","melancia","acerola"];frutas.sort();frutas.reverse();
R: ["melancia", "laranja", "amora", "acerola"]
About
Curso JavaScript ES6 essencial
Topics
Resources
Uh oh!
There was an error while loading.Please reload this page.