Símbolos ES6

S

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.

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.

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:

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:

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.

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.

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

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:

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.

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!

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad