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)