Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ES6 - Consertando as partes ruins do JavaScript

ES6 - Consertando as partes ruins do JavaScript

Palestra feita no JSDay 2016 em Campina Grande.

Diógenes Fernandes

April 23, 2016
Tweet

More Decks by Diógenes Fernandes

Other Decks in Technology

Transcript

  1. ES6 Consertando as partes ruins do JavaScript / / Software

    Engineer at Diógenes Fernandes @diofeher Robots + Rockets
  2. If I had done classes in JavaScript back in May

    1995, I would have been told that it was too much like Java or that JavaScript was competing with Java … I was under marketing orders to make it look like Java but not make it too big for its britches … [it] needed to be a silly little brother language. Brendan Eich
  3. Hoisting x = 5; // Assign 5 to x elem

    = document.getElementById("demo"); // Find an element elem.innerHTML = x; // Display x in the element var x; // Declare x
  4. Problemas com Hoisting // var i; var anchors = document.getElementsByTagName(“a”);

    for(var i=0, len=anchors.length; i < len; i++) { anchors[i].onclick = function(){ alert(i); // alert 10 ten times }; }
  5. Usando IIFE para resolver o problema Código ruim de ler

    e estranho para pessoas novas na linguagem var anchors = document.getElementsByTagName(“a”); for(var i=0, len=anchors.length; i < len; i++) { anchors[i].onclick = (function(i){ return function() { alert(i); // 1, 2, 3... } })(i); }
  6. const para variáveis read-only const API_KEY = '123lkdsfj43ojisKOD21a'; const CONFIG

    = { TEMPLATES_URL: '/templates', TIMEZONE: 'America/Recife' } CONFIG['TEMPLATES_URL'] = 'http://s3.amazon.com/templates-folder';
  7. Global binding // in a browser let RegExp = "Hello!";

    console.log(RegExp); // "Hello!" console.log(window.RegExp === RegExp); // false const ncz = "Hi!"; console.log(ncz); // "Hi!" console.log("ncz" in window); // false
  8. Novas Multi-linha let test = `Aqui podemos escrever utilizando uma

    nova linha e o JS irá reconhecer.` let message = `WhiteSpace string`;
  9. Interpolação de strings (ES5) // Usando o operador + var

    name = 'Tyler Durden'; var phrase = 'As coisas que você possui acabam possuindo você.'; var say = '"'+ phrase +'" por ' + name; console.log(say); // "As coisas que você possui acabam // possuindo você." por Tyler Durden
  10. Interpolação de strings (ES6) // Usando o operador + var

    name = 'Tyler Durden'; var phrase = 'As coisas que você possui acabam possuindo você.'; var say = `"${phrase}" por ${name}`; console.log(say); // "As coisas que você possui acabam // possuindo você." por Tyler Durden
  11. Interpolação usando expressões let count = 10, price = 0.25,

    message = `${count} items cost $${(count * price).toFixed(2)}.`;
  12. Desestruturação (ES5) var data = { "url": "http://twitter.com/api/", "username": "diofeher",

    "password": "javascript" }; function apiRequest(data) { var url = data.url, username = data.username, password = data.password; if(!url) { url = "http://instagram.com/api/"; } $.post(url, username, password); }; apiRequest(data);
  13. Desestruturação (ES6) var data = { "url": "http://twitter.com/api/", "username": "diofeher",

    "password": "javascript" }; function apiRequest(data) { var { url, username, password } = data; if(!url) { url = "http://instagram.com/api/"; } $.post(url, username, password); }; apiRequest(data);
  14. Arrow functions sem parâmetros (ES6) var getName = () =>

    "Javascript"; // effectively equivalent to: var getName = function() { return "Javascript"; };
  15. Arrow functions com parâmetros (ES6) var sum = (num1, num2)

    => num1 + num2; // effectively equivalent to: var sum = function(num1, num2) { return num1 + num2; };
  16. Arrow functions - this (ES5/6) var test = function() {

    that = this; var doSomething = function() {}; document.addEventListener("click", function(event) { this.doSomething(event.type); // certo é that }); } document.addEventListener("click", function() { event => this.doSomething(event.type));
  17. Argumentos default (ES5) Problema: Se o argumento for 0 ou

    string vazia var myFunction = function(a, b, c){ a = a || 10; b = b || 5; c = c || 8; return a * b * c; };
  18. Argumentos default melhorados (ES5) var myFunction = function(a, b, c){

    a = (typeof a !== "undefined") ? a : 10; b = (typeof b !== "undefined") ? b : 5; c = (typeof c !== "undefined") ? c : 8; return a * b * c; };
  19. Parâmetros sem nome (ES5) function pick(object) { let result =

    Object.create(null); for (let i = 1, len = arguments.length; i < len; i++) { result[arguments[i]] = object[arguments[i]]; } return result; } let book = { title: "Understanding ECMAScript 6", author: "Nicholas C. Zakas", year: 2015 }; let bookData = pick(book, "author", "year"); console.log(bookData.author); // "Nicholas C. Zakas" console.log(bookData.year); // 2015
  20. Parâmetros Rest (ES6) function pick(object, ...keys) { let result =

    Object.create(null); for (let i = 0, len = keys.length; i < len; i++) { result[keys[i]] = object[keys[i]]; } return result; }
  21. Passando array como argumento (ES5) let values = [25, 50,

    75, 100] console.log(Math.max.apply(Math, values)); // 100
  22. Passando array como argumento (ES6) let values = [25, 50,

    75, 100] console.log(Math.max(...values)); // 100
  23. Definição de métodos (ES5) var language = { name: "Javascript",

    sayName: function() { console.log(this.name); } };
  24. Comparação de Objetos (ES5) NaN == NaN // false NaN

    === NaN // false var result = isNan(NaN) // true
  25. Classes (ES5) function PersonType(name) { this.name = name; } PersonType.prototype.sayName

    = function() { console.log(this.name); }; let person = new PersonType("Diogenes"); person.sayName(); // outputs "Diogenes"
  26. Classes (ES6) class PersonClass { // equivalent of the PersonType

    constructor constructor(name) { this.name = name; } // equivalent of PersonType.prototype.sayName sayName() { console.log(this.name); } } let person = new PersonType("Diogenes"); person.sayName(); // outputs "Diogenes"
  27. First-class Citizens function createObject(classDef) { return new classDef(); } let

    obj = createObject(class { sayHi() { console.log("Hi!"); } }); obj.sayHi(); // "Hi!"
  28. Gets e Sets class Element { constructor(element) { this.element =

    element; } get val() { return this.element; } set val(value) { this.element = value; } } test = new Element("test") console.log(a.val) // "test" a.element = 3; console.log(a.val) // 3
  29. Super keyword (ES5) var myBaseObj = { sayName: function(){ //

    .. do something }; }; var mySubObj = Framework.extend(myBaseObj, { sayName: function(){ this._super.apply(this, arguments); // .. do something else } })
  30. Super keyword (ES6) var myBaseObj = { sayName: function(){ //

    .. do something }; }; var mySubObj = { __proto__: myBaseObj, sayName: function(){ super.sayName(); // .. do something else } })