A diferença entre funções regulares e arrow functions:

A Arrow function é um recurso que foi introduzido no ES6. É uma maneira mais concisa de escrever expressões de função e funciona de maneira semelhante às funções regulares, mas com certas diferenças.

let somar = function(n1, n2){
    return n1 + n2;
}

// Utilizando arrow functions =>

let somar = (n1, n2) => { return n1 + n2 };

O arrow function permite ao desenvolvedor alcançar o mesmo resultado simplificando o seu código. Os colchetes se tornam desnecessários se apenas uma expressão seja realizada:

let somar = (n1, n2) => n1 + n2;

Se houver apenas um argumento na função, os parênteses tornam-se desnecessários:

let multiplicaQuadrado = x =:> x * x;

E, caso não existam argumentos:

let dizerOla = _ => console.log("Olá");

As arrow functions têm acesso ao objeto de argumentos da função pai regular mais próxima. Os parâmetros nomeados e restantes são muito utilizados para capturar argumentos passados para arrow functions:

// Em uma função regular
let minhaFuncao = {
    mostrarArgumentos(){
        console.log(argumentos);
    }
};
minhaFuncao.mostrarArgumentos(1, 2, 3, 4);

// Utilizando arrow functions:
let minhaFuncao = {
    mostrarArgumentos: () => {
        console.log(...argumentos);
    }
};
minhaFuncao.mostrarArgumentos(1, 2, 3, 4);

// Argumento is not defined

As funções de seta não tem as suas próprias THIS, sendo o contrário de uma expressão regular. O valor de this dentro de um arrow está sempre ligado ao valor de this na função pai regular que seja mais próxima.

let pessoa = {
    nome: "Fulano Ciclano",
    thisArrow: () => {
        console.log("O nome é: " + this.nome); // Não há binding para this aqui
    },
    thisRegular(){
        console.log("O nome é: " + this.nome); // O bind vai funcionar aqui
    }
};

pessoa.thisArrow();
pessoa.thisRegular();

/* Saída */
//Meu nome é
//Meu nome é Fulano Ciclano

As funções regulares criadas utilizando declarações ou expressões de função são construtivas. Como elas são funções construtoras, elas podem ser invocadas utilizando a palavra-chave new.

As arrow functions  não são construtivas, então, não podem ser chamadas utilizando a palavra-chave new:

let soma = (n1, n2) => console.log(n1 + n2);

new soma(2, 3);

/* Saída */
// soma is not a constructor

As funções de seta também não podem ter parâmetros nomeados duplicados, seja no modo estrito ou não. Isso significa que:

// Isso aqui é válido
function somar(x, x){
    //...Seu código aqui
}

Mas ao utilizar o modo estrito, não é válido:

'use strict'
function somar(x, x) {} 
// SyntaxError: duplicate formal argument x

Com as arrow functions, os argumentos duplicados serão sempre inválidos, independente de estar ou não em modo estrito:

(x, x) => {}
// SyntaxError: duplicate argument names not allowed in this context

Referência: https://medium.com/better-programming/difference-between-regular-functions-and-arrow-functions-f65639aba256

Gostou deste artigo? Comente abaixo e mostre para seus amigos!

Dicas de segurança para código JavaScript

Com a alta dos crimes cibernéticos, é extremamente importante utilizar os recursos de segurança ao nosso favor. Como desenvolvedores de software e aplicações, precisamos seguir, no mínimo, algumas das melhores práticas para poder mitigar os ataques e possivelmente evitá-los. Então, aí vão algumas dicas de como tornar o seu código mais seguro:

Confiança

Cuidado ao confiar dados à terceiros. Ao escrever código para Web, não confie em ninguém. Você pode ter uma arquitetura de validação em vigor a seu favor. Com dados provenientes do seus servidores, ou dos usuários, é muito importante sempre validar os dados antes dos mesmos entrarem no seu aplicativo. Com formulários na web, corremos o risco de termos brechas para SQL Injections, Cross-Site Scripting (XSS) e outros problemas relacionados. Por isso, é importante a existência de validação de dados.

Minimize o seu código

Existem coisas muito utilizadas por pessoas más-intencionadas: as ferramentas do navegador. Lá, eles podem ter acesso ao código JavaScript, podendo entendê-lo e utilizar as brechas de segurança para prejudicar sua aplicação.

Sempre tente minimizar e ofuscar o seu código, removendo caracteres desnecessários e modificando seu código para dificultar e legibilidade de terceiros. Você pode utilizar ferramentas para redução do seu código e também, para ofuscá-lo.

Linting:

O JavaScript é dinâmico e flexível. Isso torna-o muito suscetível a introdução de erros. O Linting é um processo de análise de código, que retorna para você alguns “erros” que pareçam suspeitos.

Utilize o strict

Se você não utilizar o modo estrito(strict), as ferramentas de linting logo o alertarão. O modo use strict adiciona algumas exceções ao seu código, não permitindo realizar algumas ações denominadas inseguras, como acessar objetos globais declarados. O modo estrito garante que o seu código seja bem pensado e consequentemente, mais seguro.

Simplicidade

Se esforce para manter sua aplicação simples. Seu design, a arquitetura do seu software, seu código. Quanto mais complexo, maior a possibilidade de vulnerabilidades e mais fácil ele pode vir a ser alvo de invasores. Sempre utilize os guias de estilo e melhores práticas de codificação.

Concluindo

Estes são alguns passos eficazes e simples de como você pode tornar o seu aplicativo menos vulnerável à ataques de invasores. Utilize as dicas e implemente-as na sua aplicação.

Referências:https://ngninja.com/posts/secure-coding-javascript

Gostou deste artigo? Comente abaixo:

Diferença de var, let e const no JavaScript

Diferenças:

Você sabe qual a diferença entre var, let e const em JavaScript? Sabe como aplicá-las? Descubra tudo no artigo abaixo:

Variável, um breve resumo:

Uma variável referencia um espaço na memória, utilizado para guardar informações. Uma variável é um dos, se não o conceito mais importante em programação, e independe da linguagem de programação utilizada. Na variável, nós armazenamos um valor neste espaço de memória e informamos o seu tipo. Ela se chama variável, pois poderá ser alterada ao longo do tempo, ou seja, o valor é “variável”.

No JavaScript, não precisamos informar o tipo do dado armazenado na memória. Mas existem três tipos de variáveis no JavaScript, elas são:

  • var;

  • let;

  • const;

Agora vamos ver o conceito e aplicação de cada uma delas:

Var:

Em JavaScript, o escopo é dado por funções, e não por blocos. A palavra “var” garante a variável dentro do escopo onde ela foi declarada, ou seja, pode ser acessada de qualquer ponto dentro do código, como no exemplo abaixo:

// var está sendo declarado dentro do escopo da função
function imprimeNome() {
    var nome = "Fulano";
}
imprimeNome();
console.log('Meu nome é: ', nome);

Executando este código, a saída será “Uncaught ReferenceError: nome is not defined”.

Mas por que? Porque a variável nome não possui nenhum valor definido fora do escopo da função, ou seja, a variável nome só existe dentro da função imprimeNome.

Segundo as boas práticas, o var está aos poucos sendo substituído pelo uso do let e const.

Let:

A palavra-chave “let” é usada para declarar as variáveis com escopo de bloco. Ou seja, quando é declarada dentro de qualquer bloco, seja ele uma função, uma condicional ou um loop, ela ficará acessível apenas dentro do bloco do qual foi declarada.

Seu comportamento é igual ao da variável “var” quando ela for declarada fora de função, no escopo global. Observe o exemplo abaixo:

// variável let a declarada no escopo global e
// variável let b declarada no escopo da função
let a = "fulano";
function imprimeNome() {
    let b = "ciclano";
    if (a != b) {
    console.log("Seu nome é ", a, "ou", b, "?");
    }
}
imprimeNome();

Executando o código acima, a saída será: Seu nome é fulano ou ciclano?

Mas por que funcionou? Veja bem, o let possui escopo global e também é acessível dentro da função, portanto, poderá ser acessada e retornar os seus valores.

Const:

A palavra-chave “const” indica uma variável que possui o valor fixo, uma constante. Não significa que é imutável, mas sim, que a constante não poderá ser alterada. A constante pode ser declarada tanto ao escopo global, quando em uma função, funcionando de maneira parecida com o “let”, com a diferença que o “const” terá um valor constante. Veja no exemplo a seguir:

// variável const declarada no escopo global
const valor = 12;
function imprimeValor(){
    for(valor = 12; valor < 15; valor++){
        console.log('Valor: ', valor);
    }
}
imprimeValor();

Executando o código, o retorno será um erro: Uncaught TypeError: Assignment to constant variable. Isso acontece porque o laço for incrementará a constante, alterando o seu valor.

Gostou deste artigo? Deixe sua opinião nos comentários!

Prettier 1.15: Formatador de Código Adiciona Suporte Angular e Vue.js

Caso você ainda não conheça o Prettier, acesse o site oficial para mais detalhes. A versão 1.15 do Prettier adiciona suporte ao formatador de código para HTML, Vue.js, Angular e MDX, além de adicionar uma variedade de refinamentos e melhorias de sintaxe.

De forma resumida, o Prettier é um software de código aberto disponível sob a licença MIT. Contribuições e feedback são incentivados através do projeto Prettier GitHub e devem seguir as diretrizes de contribuição do Prettier.

Sua principal função é ser um formatador de código opinativo que tenta reduzir os problemas de formatação do código. Iniciado como um projeto JS, o suporte da Prettier se expandiu para abranger muitas outras linguagens, incluindo TypeScript, Flow, HTML5, CSS, Markdown e YAML, com desenvolvimento em andamento para adicionar suporte a Elm, Java, PHP, Python, Ruby e Swift. O Prettier também suporta vários formatos, incluindo JSX, JSON, Vue.js, Angular, SCSS, Less, componentes estilizados e GraphQL.

O Prettier agora pode ser usado para formatar o conteúdo de remarcação, bem como o conteúdo JSX em um recurso MDX.Caso você não conheça, o MDX é uma extensão do markdown que suporta sintaxe JSX. Outra funcionalidade legal é o suporte a interpolação e atributos para Vue.js e Angular, assim como a sintaxe de modelo inline do Angular.

Entre as diversas novidades, Prettier agora pode formatar arquivos de modelo dessas estruturas que estendem o HTML para o Angular e o Vue.js,. Além de fornecer um mecanismo para adicionar comentários para controlar como a marcação é formatada para impedir que a ferramenta remova ou adicione espaços em branco que possam afetar o estilo e os layouts do conteúdo. Os modos de espaço em branco podem corresponder ao comportamento do CSS ou tratar o espaço em branco como sensível (sensitive) ou insensível (insensitive).

O lançamento do Prettier 1.15 faz muitas melhorias na análise do JavaScript, incluindo o nivelamento do else-branch por ternários aninhados, mantendo inline os decoradores se eles foram escritos em linha, respeitando a ordem dos decoradores e melhorando como os objetos são divididos em linhas separadas. Além disso, dezenas de outras melhorias foram feitas para a API geral da Prettier e a variedade de idiomas suportados pela Prettier.

 

O que é ECMAScript, ES6, ES8?

Aprender JavaScript pode ser confuso por uma série de razões. Não permita que essas siglas o confundam mais. Vamos dividir e conquistar as abreviaturas do JS eES neste post!

O que é ECMAScript?

Aqui está o que aconteceu há muito tempo atrás: O JavaScript foi originalmente chamado de assim na esperança de capitalizar o sucesso do Java. Então a Netscape enviou JavaScript para a organização que padroniza informações, conhecida como ECMA International for Standardization. Isso resultou em um novo padrão de idioma, conhecido como ECMAScript.

Simplificando, o ECMAScript é um padrão. Enquanto o JavaScript é a implementação mais popular desse padrão. O JavaScript implementa o ECMAScript e constrói em cima dele.

 

Ok, então é o ‘ES’?

ES é simplesmente curto para ECMAScript. Toda vez que você vê ES seguido de um número, ele está fazendo referência a uma edição do ECMAScript. Na verdade, existem oito edições do ECMAScript publicadas. Abaixo listaremos quais foram as primeiras 4 edições do ECMAScript, e para economizar tempo, não vamos também em profundidade. Apenas saiba que as três primeiras edições foram anuais, e a quarta foi abandonada devido a diferenças políticas.

  • ES1: junho de 1997
  • ES2: junho de 1998
  • ES3: dezembro de 1999
  • ES4: Abandonado

Agora veremos as versões mais recentes e o que elas fizeram de diferente

ES5

Dezembro de 2009: quase 10 anos depois, o ES5 foi lançado em 2009. Levaria quase seis anos para que a próxima versão do ECMAScript fosse divulgada. Adiciona “strict mode”, ao subconjunto destinado a fornecer uma verificação de erros mais completas e construções propensas a erros. Esclarece muitas ambiguidades nas especificações da 3ª edição e acomoda o comportamento de implementações do mundo real que diferiram consistentemente dessa especificação. Adiciona alguns novos recursos, como getters e setters, suporte de biblioteca para JSON e reflexão mais completa sobre propriedades do objeto.

 

ES6 / ES2015

Talvez a causa de toda a sua confusão começa aqui. Você vê, ES6 e ES2015 são a mesma coisa. ES6 foi o nome popularizado antes da liberação. No entanto, o comitê que supervisiona as especificações do ECMAScript tomou a decisão de passar às atualizações anuais. Com essa mudança, a edição foi renomeada para ES 2015 para refletir o ano de lançamento. Os lançamentos subsequentes também serão nomeados de acordo com o ano em que forem divulgados.

Adiciona nova sintaxe significativa para escrever aplicativos complexos, incluindo classes e módulos, mas os define semanticamente nos mesmos termos que o modo estrito ECMAScript 5. Outros novos recursos incluem iteradores e repetições for/of, funções de seta (arrow), dados binários, arrays digitados, coleções (mapas, conjuntos e mapas fracos), promessas, número e aprimoramentos matemáticos.

 

ES2016 (ES7)

A Sétima Edição, também conhecida como ECMAScript 2016, pretende continuar os temas de reforma da linguagem, isolamento de código, controle de efeitos e habilitação de biblioteca / ferramenta de ES2015, inclui dois novos recursos: o operador de exponenciação (**) e Array.prototype.includes.

 

ES2017 (ES8)

Novos recursos propostos incluem simultaneidade e atômica, transferência de dados binários de cópia zero, mais número e aprimoramentos de matemática, integração sintática com promessas (aguardar / assíncrono), fluxos observáveis, tipos de SIMD, melhor meta-programação com classes, propriedades de classe e instância, sobrecarga de operador, Tipos de valor, registros, tuplas and traits.

Diferença de className, classList e setAttribute

A linguagem JavaScript nos permite manipular elementos HTML de diversas formas e algumas vezes precisamos montar componentes “on the fly” pois eles dependem de atualizações vindas de fontes externas, ações do usuário ou que o banco de dados finalmente termine de processar algum calculo monstruoso que aquele cliente disse ser fundamental.

Quando isso acontece, precisamos trabalhar para criar elementos que além de uteis sejam bonitos e com isso vem as implementações de CSS. Agora você que a passou por isso pode ter se deparado com a possibilidade de usar os métodos

  • Classname
  • Classlist.add
  • Setattribute

A performance

Mas qual é o melhor? Vale a pena ter um método para definir classes e um para definir atributos? Tendo isso em vista, resolvi pesquisar para saber qual seria a melhor opção. Segundo o site https://measurethat.net/Benchmarks/Show/54/0/classname-vs-setattribute-vs-classlist, alguém já havia se perguntado o mesmo. Eles fizeram o seguinte teste que rodei no Chrome, Edge e Firefox:

<div id="foo"></div>

className

var element = document.getElementById("foo");
var i = 1000;
while (i--) {
    element.className = "bar";
}

setAttribute

var element = document.getElementById("foo");
var i = 1000;
while (i--) {
    element.setAttribute("class", "bar");
}
classList
var element = document.getElementById("foo");
var i = 1000;
while (i--) {
    element.classList.add("bar");
}

Resultado em operações por segundo

Chrome

Firefox

Edge

Na prática

Mesmo sendo bem claro, o teste acima não é um absoluto, devemos levar em consideração outros fatores como manipulação, funcionalidades e boas práticas.

  1. className: Permite a manipulação das classes no formato string, nesse caso tendo uma string com todas as classes escritas dentro e permitindo a manipulação dos dados neste formato. Por ser uma funcionalidade antiga, é utilizado por diversos navegadores
  2. setAttribute: O set atribute simplesmente faz isso, define o valor dentro de um atributo. Existe o getAttribute que permite visualizar este valor, mas a manipulação é limitada a isso.
  3. classList: Coloca as classes dentro de uma lista para serem manipuladas de forma ordenada através de diversos métodos específicos. A nível de funcionalidade é a mais prática, mas além de ter uma performance inferior, não foi implementada em navegadores mais antigos.

Conclusão

Acredito que o className e o classList sejam os melhores candidatos. Se você precisa de performance e está apenas definindo e apagando classes, utilize o className. Agora se você tem um sistema que precisa procurar por classes dentro da tag ou adicionar apenas se não existe, poupe o esforço de criar uma lógica para isso e utilize o classList.

Boas práticas de JavaScript que você precisa saber

Boas práticas de programação são sempre bem-vindas em qualquer código. Infelizmente nem tudo pode ser aproveitado de uma linguagem para outra devido a forma como as mesmas são implementadas em seu “encanamento” para transformar o nosso código em imagens, animações, arquivos, etc…

Tendo isto em vista isto, coloquei aqui uma lista de boas práticas para programar em JavaScript que podem ajudar a melhorar o desempenho, eficiência e entendimento do seu código.

1) Evite usar variáveis globais

Sempre que possível, evite utilizar variáveis globais. Isso inclui todos os tipos de dados, objetos e funções pois eles podem ser sobrescritos por outras bibliotecas ou códigos espalhados pelo seu site/aplicativo. Outro possível problema é que a performance, apesar de pouco, é afetada negativamente pois demora mais tempo para o código ler as variáveis globais no JavaScript.

2) Utilização dos ponto-e-vírgulas

Teoricamente, a maioria dos interpretadores deveria permitir que os ponto-e-vírgulas sejam omitidos de certas partes do código (ex.: antes do fechamento das chaves e ao definir valores a variáveis). No entanto isso não é necessariamente uma regra e pode levar seu código executar de forma não desejada.

3) Nunca declare números, strings e booleanos como objetos.

Declarar variáveis de tipos “primitivos” como objetos causa um impacto na performance do código que é desnecessário em 99% das vezes que é feito desta forma. Sempre que possível declare-os utilizando os valores primitivos (ex.: var umaString = “teste”;).

4) JavaScript Puro Sempre Pode Ser Mais Rápido Que Usar Uma Biblioteca

Bibliotecas como o Jquery, bootstrap.js, w3.js entre outras são ótimas ferramentas para reduzir o tempo de desenvolvimento de aplicativos e websites. No entanto, elas pesaram para serem carregadas por seus usuários e as funções que elas fornecem podem ser significativamente mais lentas que a utilização do JavaScript puro. Por isso, avalie sempre a necessidade de utilização dela e também se ela seria substituível por algumas funções prontas da linguagem.

5) Coloque os Scripts na Parte Final da Sua Página

Algumas bibliotecas e frameworks já tem instruído os desenvolvedores, mas vale a pena lembrar. Sempre que possível, chame os scripts no final antes do </body>, pois desta forma você estará permitindo que o html e o css renderizem em tela antes de carregar os scripts. Isto dá uma sensação de velocidade maior para o usuário que dificilmente interagirá com seu site antes do binding de eventos e carregamentos das funções.

6) Minimize as chamadas HTTP

Cerca de 80% do tempo de resposta para o usuário final é gasto no front-end e boa parte deste tempo é baixando imagens, stylesheets, scripts, etc… É aconselhável que você entregue todo o código JavaScript de uma vez só e assim economizar a chamadas para cada arquivo. Para isso existem diversas ferramentas que permitem minificar e unir diversos arquivos JavaScript em um só. Verifique se sua IDE e linguagem de programação back-end possuem tal funcionalidade.

7) Deixe o código JavaScript em arquivos externos

Normalmente o uso de arquivos externos (colocar o código em um arquivo js ao invés da tag script dentro do html) gera uma página com tempo de carregamento mais rápido pois o navegador costuma fazer cache de arquivo JS e CSS. Se o estilo e o script do código existir junto com o HTML, ele será baixado junto com a página toda vez que a mesma for carregada. Por mais que essa prática reduza o número de chamadas http, ela aumenta o tempo base fixo para carregamento do website.

8) Minifique e use Gzip

Apesar da indentação e comentários serem ótimos para melhorar a leitura, entendimento e clareza do seu código, os interpretadores não precisam deles e na verdade precisam trabalhar mais para isso. Por isso, utilize uma ferramenta para criar uma cópia minificada do seu código javascript quando for colocá-lo em produção.

Outra ferramenta que pode reduzir o tamanho de seus arquivos em mais da metade é o gzip, reduzindo o tempo necessário para que o conteúdo seja baixado pelo usuário final.

9) Comente seu código

Essa última dica deveria ser cadeira de faculdade. O código comentado facilita muito a comunicação do que está (ou deveria estar) acontecendo no programa e permite que outros programadores possam navegar com menos trabalho em scripts que não são deles. Para aqueles que trabalham sozinhos e acreditam que não precisam comentar seu próprio código pois são os únicos que o lerão eu lhes pergunto, você já consegue pegar o código fonte de um programa complexo seu escrito 2 anos atrás e dizer de cara o que cada função faz?