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)