Default Params

// Default Params
function newFunction (name, age, country) {
  var name = name || 'adrian'
  var age = age || 26
  var country = country || 'México'
  console.log(name, age, country)
}

//es6 default params
function newFunction2 (name="adrian", age = 26, country = 'MX') {
  console.log(name, age, country)
}
newFunction2()
newFunction2('Adrian', '26', 'JP')

// all the params sended taken in a single var
function howMany(...args) {
  return "You have passed " + args.length + " arguments.";
}
console.log(howMany(0, 1, 2));
console.log(howMany("string", null, [1, 2, 3], { }));

Template Literals

//templates 
let hello = "Hello"
let world = "World"
let epicPhrase = hello + ' ' + world
console.log(epicPhrase)

//es6 template-literals
let epixPhrase2 = `${hello} ${world}`
console.log(epixPhrase2)
//concatenar
let lorem = "Lorem ipsum dolor sit amet consectetur. \\n" 
+ "otro pedazo de la frase \\n" 
+ "y otra más."
console.log(lorem)

//es6 concatenacion
let lorem2 = `otra fase epica que no termina en la primera linea
sino que tiene dos 
o mas lineas.`
console.log(lorem2)

Destructuring assignment

//Object
let person = {
  'name': 'Adrian',
  'age': '26',
  'country': 'MX'
}

//desctructuracion de elementos
console.log(person.name, person.age, person.country)

//es6 desctructuracion de elementos
let { name, age, country } = person
console.log(name, age, country)

//desctructuracion cambiando el nombre de la variable
let { name: myname, age: myage, country: mycountry } = person
console.log(myname, myage, mycountry)

//destructuracion de objetos anidados
const user = {
  johnDoe: { 
    age: 34,
    email: 'johnDoe@freeCodeCamp.com'
  }
};
const { johnDoe: { age, email }} = user;
console.log(age, email)
console.log(johnDoe) // error

// array deestructuring
const [a, b,,, c] = [1, 2, 3, 4, 5, 6];
console.log(a, b, c);

Spread Operator

//Arrays
let team1 = ['Adrian', 'David', 'Adilene']
let team2 = ['Nefteradi', 'Valentina', 'Ramona']

//Spread Operator
let educationold = ['Jacobo', 'Adrian', 'David', 'Adilene', 'Nefteradi', 'Valentina', 'Ramona']

//es6 Spread Operator
let education = ['Jacobo', ...team1, ...team2]

console.log(education)

Scope Variables

//vars for short using
// scope variables
{
  var globalVar = "Global Var"
}
//es6 let: solo esta disponible en el scope
{
  let globalLet = "Global Let"
  console.log(globalLet) //solo aqui es accesible
}
console.log(globalVar)
//console.log(globalLet) //aqui no funciona

Only Read Variables

//nos permite mantener el valor de las constantes
const a = 'b'; //constantes que no cambian
a = 'a'
console.log(a)

Object Syntax

//Ojects
let name = 'Adrian'
let age = 26

//es5
obj = { name: name, age: age }

//es6 objetos mejorados
obj2 = { name, age }
console.log(obj2)
console.log(obj)

Arrow Function

//Arrow functions
const names = [
  {name: 'Adrian', age: 26},
  {name: 'Nefteradi', age: 27}
]

//es5 function anonima
let listOfNames = names.map(function (item) {
  console.log(item.name)
})

//es6 function anonima
let listOfNames2 = names.map(item => console.log(item.name))
//or
const listOfNames3 = (name, age, country) => {
  ...
}
//or
const listOfNames4 = name => {
  ...
}
//or
const listOfNames5 = name => console.log(name)

Promises

//promises: algo va a pasar, cuando suceda has esto
const helloPromise = () => {
  return new Promise((resolve, reject) => {
    if (true) {
      resolve('Hey!')
    } else {
      reject('Ups!')
    }
  })
}

helloPromise()
  .then(response => console.log(response))
  .then(() => console.log('Hola!'))
  .catch(error => console.log(error))