free style
                 
                    
                    
                    
                
            
        
        
        
        
            
                
                
var str = `first line
second line
third line`;
log(str);
                
                
var name = prompt("who you think you are?");
log(`Oh, nice to meet you, ${name}!`);
                
                
var apples = 3;
var oranges = 4;
log(`I have ${apples + oranges} fruits.`);
                
            
            
                
var arr = [ "a", "b", "c" ];
arr.lastOne = "z";
//for (let i in arr) {
//   console.log(i);
//}
for (let i of arr) {
   console.log(i);
}
                
                
var domList= document.querySelectorAll("li");
for(let domEl of domList) {
    log(domEl.innerHTML);
}
                
            
            
                
var x = 123,
    y = 456;
var obj = {
        x,
        y,
        z: 789
    }
log(obj);
                
                
var x = 2,
    y = 4;
var obj = {
        x,
        y,
        addXtoY(){
            return this.x + this.y;
        }
    }
log(obj.addXtoY());
                
                
var obj = {
    localName: "",
    set name(val){
        this.localName= val.toUpperCase();
    },
    get name(){
        return this.localName;
    }
}
obj.name = "felipe";
log(obj.name);
                
                
var obj = {
    ageVal: 0,
    set age(val){
        if(val < 0){
            throw new Error("It's impossible!");
        }
        this.ageVal= parseInt(val, 10);
    },
    get age(){
        return this.ageVal + " yers old";
    }
}
obj.age = 15;
log(obj.age);
obj.age = -2;
                
            
            
                
function who (name="anonymous", age= 13) {
    return `${name} is ${age} years old`;
}
log( who('some child') );
log( who('Felipe', 29) );
log( who(void(0), 18) );
                
                
function sayMyName (...names) {
    log(names.join(' '));
}
sayMyName('Felipe',
          'Nascimento',
          'de',
          'Moura');
                
                
var basket = {
    fruits: [],
    vegetables: [],
    greens: []
}
function add (type, ...items) {
    basket[type]= basket[type]?
        basket[type].concat(items) :
        items;
}
add('fruits', 'apple', 'banana');
add('vegetables', 'carrot', 'potato');
add('greens', 'letuce');
add('fruits', 'lime');
add('meat', 'chicken', 'pork');
log(basket);
                
                
function avrgOf3 (a, b, c) {
    return (a + b + c) / 3;
}
log( avrgOf3(5, 2, 2) );
var arr = [5, 4, 3];
log( avrgOf3(...arr) );
                
            
            
                
var func = param => param.split(" ");
func("Felipe Moura");
                
                
var func = () => {
    log('first line');
    log('I received no arguments');
}
func();
                
                
let arr = ['a', 'e', 'i', 'o', 'u'];
arr.sort( (a, b)=> a < b? 1: -1 );
                
                
( x => x * 2 )( 3 );
                
                
var Person = function (name) {
    this.id = name;
    setTimeout(function () {
        log(this.id || "no id!");
    }, 1000);
    setTimeout(()=>{
        log(this.id || "no id!");
    }, 2000);
    return this;
}
var me = new Person('Felipe');
                
            
            
                
function *foo() {
    yield 1;
    yield 2;
    return 3;
}
var it = foo(); // it becomes an Iterator
log(it.next());
log(it.next());
log(it.next());
                
                
var count = 10;
function * foo(x) {
    yield (x || 1) * 3;
}
log(foo().next().value);
log(foo(2).next().value);
log(foo(3).next().value);
                
                
var count = 10;
function * foo(x) {
    yield (x || 1) * 3;
}
var theFoo = foo();
log(theFoo.next().value);
log(theFoo.next().value); // undefined
                
                
function * foo() {
    yield 111;
    yield 222;
    yield 333;
    return 444; // will NOT show on for..of
}
for(let val of foo()){
    log(val);
}
// this, would create a NEW iterator
// therefore, on its first yield
//log(foo().next().value);
                
                
function * counter(){
    var i = 0;
    while(true)
        yield i++;
}
var it = counter();
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
// a for..of here, would be an endless loop
                
            
            
                
var goGetThemBoy = (val)=>{
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            if(val){
                resolve("worked " + val);
            }else{
                reject(Error("It broke"));
            }
        }, 1000);
    });
}
// try changing this argument to false
goGetThemBoy(true).then((ret)=>{
    log('resolved ', ret);
}).catch((err)=>{
    log('rejected', err.message);
});
                
                
var goGetThemBoy = (val)=>{
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            if(val){
                resolve(val);
            }else{
                reject(Error("It broke"));
            }
        }, 1000);
    });
}
// try changing this argument to false
goGetThemBoy(1).then((ret)=>{
    log('resolved with ' + ret);
    return ret + 1;
}).then((ret)=>{
    log('I resolved too: ', ret);
    throw(new Error('foo'));
    return ret + 1;
}).then((ret)=>{
    log('What about me? ', ret);
}).catch((err)=>{
    log('rejected', err.message);
});
                
                
var goGetThemBoy = (val)=>{
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            if(val){
                resolve(val);
            }else{
                reject(Error("It broke"));
            }
        }, 1000);
    });
}
goGetThemBoy(1).then((ret)=>{
    log('resolved with ' + ret);
    return ret + 1;
}).then((ret)=>{
    log('I resolved too: ', ret);
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve(9);
        }, 1000);
    });
}).then((ret)=>{
    log('What about me? ', ret);
}).catch((err)=>{
    log('rejected', err.message);
});
                
                
// race and all
var p1 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 3000, 'p1');
});
var p2 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 1000, 'p2');
});
var p3 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 2000, 'p3');
});
Promise.race([p1, p2, p3]).then((val)=>{
    log(val, 'was faster');
});
Promise.all([p1, p2, p3]).then((val)=>{
    log(val, 'all finished');
});
                
            
            
                
class ClassName {
    constructor(data){
        /* ... */
    }
    method1(){
        /* ... */
    }
}
var p = new ClassName({/* ... */});
                
                
class Person {
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    getName(){
        return this.name;
    }
}
var p = new Person('Felipe', 29);
log(p);
log(p.getName());
                
                
class Being {
    constructor (legs= 4, species= 'alien') {
        this.legs= legs;
        this.species = species;
    }
    eat () {
        log('ate');
    }
    runAway () {
        log('gone!');
    }
}
class Human extends Being {
    constructor (name) {
        this.name = name;
        super(2, 'human');
    }
    eat () {
        log('ate, and saved for later');
    }
}
var dog= new Being(4, 'canine');
var person= new Human('Felipe');
log(person);
log(person.eat());