On Github diofeher / jsday
Diógenes Fernandes / @diofeher / Software Engineer at Robots + Rockets
Brendan Eich - Netscape em Abril de 1995
10 dias para criar um protótipo de linguagem leve
Java vs Javascript: primos?
Brendan Eich
European Computer Manufacturers Association
1997: Primeira versão ECMA-262
Especificação finalizada em Junho/2015
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
        // 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
    };
}
        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);
}
            Código ruim de ler e estranho para pessoas novas na linguagem
var anchors = document.getElementsByTagName(“a”);
for(let i=0,len=anchors.length; i < len; i++){
    anchors[i].onclick = function(){
        alert(i);
    }
}
        const API_KEY = '123lkdsfj43ojisKOD21a';
const CONFIG = {
    TEMPLATES_URL: '/templates',
    TIMEZONE:  'America/Recife'
}
CONFIG['TEMPLATES_URL'] = 'http://s3.amazon.com/templates-folder';
        // 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
        var test = "Aqui temos uma\n" + "string que \n" + "tem várias linhas."
let test = `Aqui podemos 
escrever utilizando uma nova linha
e o JS irá reconhecer.`
let message = `WhiteSpace
               string`;
        // 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
// 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
        let count = 10,
    price = 0.25,
    message = `${count} items cost $${(count * price).toFixed(2)}.`;
        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);
        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);
        var reflect = function(value) {
    return value;
};
        var getName = () => "Javascript";
// effectively equivalent to:
var getName = function() {
    return "Javascript";
};
        var reflect = value => value;
var sum = (num1, num2) => num1 + num2;
// effectively equivalent to:
var sum = function(num1, num2) {
    return num1 + num2;
};
        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));
        var myFunction = function(a, b, c){
    a = a || 10;
    b = b || 5;
    c = c || 8;
    return a * b * c;
};
            Problema: Se o argumento for 0 ou string vazia
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;
};
        var myFunction = function(a=10, b=5, c=8){
    return a * b * c;
};
        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
        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;
}
        let values = [25, 50, 75, 100] console.log(Math.max.apply(Math, values)); // 100
let values = [25, 50, 75, 100] console.log(Math.max(...values)); // 100
function createPerson(name, age) {
    return {
        name: name,
        age: age
    };
}
        function createPerson(name, age) {
    return {
        name,
        age
    };
}
        var language = {
    name: "Javascript",
    sayName: function() {
        console.log(this.name);
    }
};
        var language = {
    name: "Javascript",
    sayName() {
        console.log(this.name);
    }
};
        “7” == 7 // true “7” === 7 // false
NaN == NaN // false NaN === NaN // false var result = isNan(NaN) // true
Object.is(7, ”7”) // false Object.is(7, 7) // true Object.is(NaN, NaN) // true
function PersonType(name) {
    this.name = name;
}
PersonType.prototype.sayName = function() {
    console.log(this.name);
};
let person = new PersonType("Diogenes");
person.sayName();   // outputs "Diogenes"
        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"
        function createObject(classDef) {
    return new classDef();
}
let obj = createObject(class {
    sayHi() {
        console.log("Hi!");
    }
});
obj.sayHi();        // "Hi!"
        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
        var myBaseObj = {
    sayName: function(){
        // .. do something
    };
};
var mySubObj = Framework.extend(myBaseObj, {
    sayName: function(){
        this._super.apply(this, arguments);
        // .. do something else
    }
})
        var myBaseObj = {
    sayName: function(){
        // .. do something
    };
};
var mySubObj = {
    __proto__: myBaseObj,
    sayName: function(){
        super.sayName();
        // .. do something else
    }
})
        ...