Next Generation of Javascript
Let y const
Cuando declaramos una variable bajo la palabra reservada var
javascript entiende que:
- la variable podrรก ser reasignada o inicializada durante cualquier momento es decir que podemos sobre ecribirla
var fruit = "๐";
function reasignName(){
fruit = "๐ฅ";
console.log(fruit);
}
reasignName() //
var fruit = "๐"
console.log(fruit) //
- el escope de esta pertenece a su contexto de ejecuciรณn
- que una variable declarada fuera de un bloque como una funciรณn pertenece al alcance global.
var fruit = "๐";
function reasignName(){
var fruits = [๐,๐,๐,๐ฅ,๐ฅฅ]
fruit = "๐ฅ";
console.log(fruit);
}
var fruit = "๐"
console.log(window.fruit); // ๐
console.log(window.fruits); // undefined
Nota: las variables no declaradas siempre perteneceran al contexto global y a diferencia de las variables declaradas estas podrรกn ser eliminadas. Antipatron
var cat = "๐ฏ";
pig = "๐ท";
(function () {
lion = "๐ฆ";
})()
console.log(cat, pig, lion); //๐ฏ ๐ท ๐ฆ
delete cat; //false
delete pig; //true
delete lion; //true
console.log(cat, pig, lion); //๐ฏ undefined undefined
Let introdujo un nuevo paradigma llamado "block scope" esto hace referencia a que los if, switch conditions, while loops, foor loops, o cualquier cosa que veamos con {} es un bloque. Y con let y const podremos declarar variables en el block scope, lo que significa que estรกs variables existen sรณlo en el bloque correspondiente.
Diferencias entre var y let:
- las variables let podrรกn ser reasignadas mรกs no re-inicializadas o sobre-escritas:
let fruit = "๐";
function printMyFruit(){
let fruit = "๐ฅ";
console.log(fruit);
}
fruit = "๐"
printMyFruit(); // "๐ฅ"
console.log(fruit) // "๐"
let fruit = "๐" // Uncaught SyntaxError: Identifier 'fruit' has already been declared.
- las variables let y const sรณlo existiran dentro del bloque de scope:
function fruitsShow(){
if(true){
var fruit1 = "๐";//exist in function scope
const fruit2 = "๐";//exist in block scope
let fruit3 = "๐ฅ";//exist in block scope
}
console.log(fruit1);
console.log(fruit2);
console.log(fruit3);
}
fruitsShow();
// ๐
// error: fruit2 is not defined
// error: fruit3 is not defined
y const?, comparte las mismas caracteristicas que let pero a diferencia de esta, no podrรก ser reasignada, serรก por consiguiente una variable de sรณlo lectura
const cat = "๐ฑ";
cat = "๐"; //Uncaught TypeError: Assignment to constant variable.
Arrow Functions
- Las funciones flecha tienen una sintaxis diferente:
function myFunc(){
....
}
const myFunc = () => {
....
}
- Resuelve cierto tipo de issues que se tenian con la palabra this:
var object = {
dino: "๐ฆ",
arrow: () => {
console.log(this.name);
},
anonym: function () {
console.log(this.name);
}
};
object.arrow() //undefined
object.anonym() //๐ฆ
- las arrow function capturan el valor del scope externo mรกs cercano, para este ejemplo el escope mas cercano es el window por lo tanto la variable
dino
no existe. - las arrow function no tienen su propio
this
,arguments
,super
onew.target
lo que quiere decir que este tipo de funciones no podrรกn ser usadas como constructores. - las funciones tradicionales definen su propio valor de this.
- las arrow function no tienen sus propio
this
utiliza el valor del contexto de ejecuciรณn que la contiene.
Class
- Es una sintaxis de azucar para lo que conociamos como prototype.
class Person {
...
}
function Person () {
...
}
- Al igual que las funciones constructoras dentro de nuestras clases tendremos un contructor.
class Person {
constructor(){
this.name = name;
}
}
function Person (name) {
this.name = name;
}
- Podremos hacer todo con clases excepto modificar un prototypo ya existente o nativo. ๐
- Es el sistema de herencia de javascript esto significa que nuestras clases podrรกn tener metodos, nuestras clases podrรกn ser instanciadas y tambien podrรกn ser extendidas.
class Person {
constructor(name){
this.name = name;
}
//method
printName() {
console.log(this.name)
}
}
//instance
var me = new Person("Lu");
me.printName() // "Lu"
//extends
class Developer extends Person {
constructor(name, lenguage){
super(name);
this.lenguage = lenguage;
}
//method
imAdeveloper() {
console.log(`Hi I'm ${this.name} and I'm ${this.lenguage} developer`)
}
}
//instance
var meDev = new Developer('Lu', 'js');
meDev.imAdeveloper();
- Los methodos son funciones atachadas a las classes.
Spread & Rest Operators {...}
Es una forma de recibir multiples argumentos en llamadas a funciones o multiples elementos en un array literal.
- Spread en funciones
function spread(...myArguments) {
console.log(myArguments)
}
spread("๐ฆ","๐ฐ","๐ท","๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"); // ["๐ฆ","๐ฐ","๐ท","๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"]
- Spread en array literales
var insects = ["๐","๐","๐"];
var animals = ["๐ฆ","๐ฐ","๐ท",...insects,"๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"];
console.log(animals); //["๐ฆ", "๐ฐ", "๐ท", "๐", "๐", "๐", "๐ผ", "๐ธ", "๐ฅ", "๐จ", "๐ฆ", "๐ฐ"]
- Spread en objetos
var insects = { insects: ["๐","๐","๐"]};
var object= {
...insects,
animals: ["๐ฆ","๐ฐ","๐ท","๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"]
}
console.log(object); //{insects: Array(3), animals: Array(9)}
Destructuring
Este es un metodo simplificado de javascript para extraer multiples propiedades de un arreglo o un objeto, es llamado desconstrucciรณn y usa una sintaxis similar al a de los arrys literales o objetos.
- destructuring con Arreglos
var animals = ["๐ฆ","๐ฐ","๐ท","๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"];
var [animal1, animal2, animal3] = animals;
console.log(animal1); //๐ฆ
console.log(animal2); //๐ฐ
console.log(animal3); //๐ท
- destructuring con Arreglos y valores por defecto;
var animals = ["๐ฆ","๐ฐ"];
var [animal1, animal2, animal3 = "๐ฅ"] = animals;
console.log(animal1); //๐ฆ
console.log(animal2); //๐ฐ
console.log(animal3); //๐ฅ
- destructuring con Arreglos e ignorar elementos;
var animals = ["๐ฆ","๐ฐ", "๐ฅ"];
var [animal1, , animal3] = animals;
console.log(animal1); //๐ฆ
console.log(animal3); //๐ฅ
- destructuring con Objetos
var jungle = {
animals: ["๐ฆ","๐ฐ","๐ท","๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"],
insects: ["๐","๐","๐"]
}
var { animals } = jungle;
console.log(animals); //["๐ฆ","๐ฐ","๐ท","๐ผ","๐ธ","๐ฅ","๐จ","๐ฆ","๐ฐ"]
Referencia.
Cuando pasamos un argumento a un funcion o asignamos un valor primitivo (null, boolean, undefined, number, string, symbol) a una variable, este proceso siempre lo harรก "por valor", es decir que este tipo de elemento serรก copiado. Cuando nos referimos aun valor no primitivo (Object, Array, Function) javascript hace una copia de la referencia, esto quiere decir que tenemos un puntero por el cual podemos acceder al valor original
const tree = {
type: "apple tree ๐";
};
const otherTree = tree;
tree.type = "orange tree ๐";
console.log(otherTree) //"orange tree ๐"
- referencias circulares, son aquellas en las que un objecto contiene una referencia asรญ mismo.
const a = [1, 2, 3];
a.push(a);
console.log(a); //[1,2,3,[1,2,3]]
Top comments (0)