Símbolos ES6

    Introducción

    De todas las nuevas funciones de ES6, Simbolos podría ser uno de los más interesantes para mí. Nunca he sido desarrollador de Ruby, por lo que nunca he visto ni usado estos tipos primitivos en la práctica. Es un concepto interesante y me sumergiré en lo esencial a lo largo de este artículo.

    Te puede interesar:6 maneras fáciles de acelerar Express

    Símbolos ES6

    Entonces, ¿qué es exactamente un símbolo de JavaScript? Es un nuevo tipo de datos primitivo, único e inmutable introducido en ES6, originalmente destinado a proporcionar propiedades privadas.

    Te puede interesar:Ejecutar tareas periódicas en Node con node-cron
    var sym = Symbol(); 
    typeof sym;							// Returns "symbol" 
    

    Los símbolos se pueden utilizar para acceder a las propiedades de los objetos, al igual que las cadenas:

    Te puede interesar:Implementar la autenticación de usuario de la manera correcta
    var obj = {};
    var sym = Symbol();
    obj[sym] = "a";
    console.log(obj[sym]);				// Prints "a"
    

    La principal diferencia aquí es la propiedad a la que accede sym no aparece en el objeto si se repite, o si stringify‘re. Por ejemplo:

    Te puede interesar:Cómo programar un Arduino con JavaScript
    var obj = {};
    var sym = Symbol();
    obj['hi'] = "bye";
    obj[sym] = "a";
    
    console.log(obj);					// Prints "{hi: 'bye'}"
    
    for (var i in obj) {
        console.log(i);					// Prints "hi"
    }
    
    console.log(JSON.stringify(obj));	// Prints {"hi":"bye"}
    

    Entonces, como puede ver, la única forma de acceder a una propiedad «simbolizada» es con el objeto de símbolo original, de lo contrario ni siquiera sabría que existe la propiedad. Entonces, esto significa que podemos usar símbolos para finalmente tener propiedades privadas en JavaScript, ¿verdad? ¡No! Resulta que los símbolos se degradaron severamente de la especificación original (por razones desconocidas para mí) y no se pueden usar para crear propiedades privadas de manera confiable. Se puede acceder a los símbolos de un objeto a través de Object.getOwnPropertySymbols, haciéndolos públicos para que todos los vean.

    Te puede interesar:Clases de ES6
    var obj = {};
    var sym = Symbol();
    obj['hi'] = "bye";
    obj[sym] = "a";
    
    Object.getOwnPropertySymbols(obj);	// Returns [ Symbol() ]
    

    Una advertencia, muchas personas todavía creen que los símbolos JS proporcionan propiedades privadas a los objetos, así que tenga cuidado con lo que lee y cree en los foros y Stack Overflow. Con suerte, los conceptos erróneos se corregirán una vez que ES6 se vuelva más común.

    Te puede interesar:La guía definitiva para configurar NPM

    También puede ver muchos ejemplos en los que al símbolo se le pasa una cadena opcional, así:

    Te puede interesar:Procesadores de lenguaje de programación
    var sym = Symbol("foo");
    

    Este descriptor se utiliza estrictamente con fines de depuración y no afecta la singularidad del símbolo. Para que esto sea más claro, aquí hay un ejemplo:

    Te puede interesar:Iteradores y generadores ES6
    Symbol("foo") === Symbol("foo");	// Evaluates to false
    
    var sym = Symbol("foo");
    console.log(sym.toString());		// Prints "Symbol(foo)"
    

    Alcance global

    Es importante darse cuenta de que el uso de Symbol() La función no creará un símbolo global que esté disponible en el ámbito global. El símbolo sigue siendo específico del objeto en el que se utiliza. Sin embargo, puede crear símbolos globales utilizando Symbol.for() y Symbol.keyFor() para obtener y establecer símbolos del registro de símbolos global.

    Te puede interesar:XSLT explicado

    Symbol.for(key) busca símbolos existentes con la clave dada (una cadena) y lo devuelve si se encuentra. Si no se encuentra el símbolo, se crea uno nuevo en el registro global con la clave dada y luego se devuelve.

    Symbol.for("foo");				// Creates a new global symbol
    var sym = Symbol.for("foo");		// Retrieves the already created symbol
    

    diferente a Symbol(https://Pharos.sh.com/es6-symbols/
    )
    , especificando la clave en Symbol.for(key) devuelve el mismo símbolo cada vez, así que:

    Symbol.for("bar") === Symbol.for("bar");	// Evaluates to true
    Symbol("bar") === Symbol("bar");			// Evaluates to false
    

    Symbol.keyFor(sym) es esencialmente opuesto a Symbol.for(key), en lugar de pasar una clave para obtener un símbolo, pasa un símbolo para obtener una clave.

    var sym = Symbol.for("foo");		// Creates new global symbol
    console.log(Symbol.keyFor(sym));	// Prints "foo"
    

    Conclusión

    Aunque los símbolos de JavaScript son una idea nueva y algo interesante, soy escéptico de su utilidad sin la garantía de propiedades privadas. Algunas personas han sugerido que serán buenas para evitar conflictos de nombres, lo que puede ser útil, pero creo que su verdadero potencial no se realizará sin proporcionar propiedades verdaderamente privadas. Veremos cómo progresan las cosas con futuras actualizaciones.

    ¿Qué opinas de los símbolos? ¿De qué manera los ha encontrado útiles? ¡Háznoslo saber en los comentarios!

     

    Rate this post

    Etiquetas: