DEV Community

Lu
Lu

Posted on

Algunos poderes de Javascript

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) //
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode
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
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

Arrow Functions

  • Las funciones flecha tienen una sintaxis diferente:
    function myFunc(){
        ....
    }
Enter fullscreen mode Exit fullscreen mode
    const myFunc = () => {
        ....
    }
Enter fullscreen mode Exit fullscreen mode
  • 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() //πŸ¦–
Enter fullscreen mode Exit fullscreen mode
  • 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 o new.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 () {
        ...
    }
Enter fullscreen mode Exit fullscreen mode
  • 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;
    }
Enter fullscreen mode Exit fullscreen mode
  • 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();
Enter fullscreen mode Exit fullscreen mode
  • 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("🦊","🐰","🐷","🐼","🐸","πŸ₯","🐨","🦁","🐰"); // ["🦊","🐰","🐷","🐼","🐸","πŸ₯","🐨","🦁","🐰"]
Enter fullscreen mode Exit fullscreen mode
  • Spread en array literales
    var insects = ["πŸ›","🐝","🐞"];
    var animals = ["🦊","🐰","🐷",...insects,"🐼","🐸","πŸ₯","🐨","🦁","🐰"];
    console.log(animals); //["🦊", "🐰", "🐷", "πŸ›", "🐝", "🐞", "🐼", "🐸", "πŸ₯", "🐨", "🦁", "🐰"]
Enter fullscreen mode Exit fullscreen mode
  • Spread en objetos
    var insects = { insects: ["πŸ›","🐝","🐞"]};
    var object= {
        ...insects,
        animals: ["🦊","🐰","🐷","🐼","🐸","πŸ₯","🐨","🦁","🐰"]
    }
    console.log(object); //{insects: Array(3), animals: Array(9)}
Enter fullscreen mode Exit fullscreen mode

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); //🐷
Enter fullscreen mode Exit fullscreen mode
  • destructuring con Arreglos y valores por defecto;
    var animals = ["🦊","🐰"];
    var [animal1, animal2, animal3 = "πŸ₯"] = animals;
    console.log(animal1); //🦊
    console.log(animal2); //🐰
    console.log(animal3); //πŸ₯
Enter fullscreen mode Exit fullscreen mode
  • destructuring con Arreglos e ignorar elementos;
    var animals = ["🦊","🐰", "πŸ₯"];
    var [animal1, , animal3] = animals;
    console.log(animal1); //🦊
    console.log(animal3); //πŸ₯
Enter fullscreen mode Exit fullscreen mode
  • destructuring con Objetos
    var jungle = {
        animals: ["🦊","🐰","🐷","🐼","🐸","πŸ₯","🐨","🦁","🐰"],
        insects: ["πŸ›","🐝","🐞"]
    }

    var { animals } = jungle;

    console.log(animals); //["🦊","🐰","🐷","🐼","🐸","πŸ₯","🐨","🦁","🐰"]
Enter fullscreen mode Exit fullscreen mode

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 🍊"
Enter fullscreen mode Exit fullscreen mode
  • 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]]
Enter fullscreen mode Exit fullscreen mode

Top comments (0)