You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/08-symbol/article.md
+32-32Lines changed: 32 additions & 32 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
2
2
# Tipo Symbol
3
3
4
-
Por especificación, las claves de un objeto deben ser solamente del tipo String o Symbol. Solamente esos dos: String o Symbol.
4
+
Por especificación, las claves (Keys) de un objeto deben ser solamente del tipo String o Symbol. Solamente esos dos: String o Symbol.
5
5
6
6
Hasta ahora sólo hemos aprendido acerca de los Strings, por lo que es momento de conocer las ventajas que Symbol nos puede dar.
7
7
@@ -46,7 +46,7 @@ Por ejemplo, este `alert` mostrará un error:
46
46
```js run
47
47
let id = Symbol("id");
48
48
*!*
49
-
alert(id); // TypeError: Cannot convert a Symbol value to a string
49
+
alert(id); // TypeError: No puedes convertir un valor Symbol en string
50
50
*/!*
51
51
```
52
52
@@ -70,11 +70,11 @@ alert(id.description); // id
70
70
71
71
````
72
72
73
-
## Propiedades "Ocultas"
73
+
## Claves "Ocultas"
74
74
75
-
Los Symbols nos permiten crear propiedades "ocultas" en un objeto, a las cuales ninguna otra parte del código puede accesar ni sobrescribir.
75
+
Los Symbols nos permiten crear claves "ocultas" en un objeto, a las cuales ninguna otra parte del código puede accesar ni sobrescribir.
76
76
77
-
Por ejemplo, si queremos guardar un "identificador" para el objeto `user`, podemos asignar un symbol como propiedad del objeto:
77
+
Por ejemplo, si queremos guardar un "identificador" para el objeto `user`, podemos asignar un symbol como clave del objeto:
78
78
79
79
```js run
80
80
let user = { // pertenece a otro código
@@ -85,22 +85,22 @@ let id = Symbol("id");
85
85
86
86
user[id] =1;
87
87
88
-
alert( user[id] ); // podemos accesar a la información utilizando el symbol como nombre de propiedad
88
+
alert( user[id] ); // podemos accesar a la información utilizando el symbol como nombre de clave
89
89
```
90
90
91
91
¿Cuál es la ventaja de usar `Symbol("id")` y no un string `"id"`?
92
92
93
93
Vamos a profundizar en el ejemplo para que sea más claro.
94
94
95
-
Imagina que otro script quiere tener la propiedad "id" dentro de `user` para sus propios fines. Puede ser otra librería de JavaScript, por lo cual ninguno de los scripts saben de su coexistencia.
95
+
Imagina que otro script quiere tener la clave "id" dentro de `user` para sus propios fines. Puede ser otra librería de JavaScript, por lo cual ninguno de los scripts saben de su coexistencia.
96
96
97
97
Y entonces ese script puede crear su propio `Symbol("id")`, como este:
98
98
99
99
```js
100
100
// ...
101
101
let id =Symbol("id");
102
102
103
-
user[id] ="Their id value";
103
+
user[id] ="Su id";
104
104
```
105
105
106
106
No habrá conflicto porque los Symbols siempre son diferentes, incluso si tienen el mismo nombre.
@@ -110,12 +110,12 @@ Ahora ten en cuenta que si utilizamos un string `"id"` en lugar de un Symbol par
110
110
```js run
111
111
let user = { name:"John" };
112
112
113
-
// Nuestro script usa la propiedad "id"
114
-
user.id="Our id value";
113
+
// Nuestro script usa la clave "id"
114
+
user.id="Nuestro valor id";
115
115
116
116
// ...Otro script también quiere usar "id" ...
117
117
118
-
user.id="Their id value"
118
+
user.id="Su valor de id"
119
119
// Boom! sobreescrito para otro script!
120
120
```
121
121
@@ -139,7 +139,7 @@ Se hace así porque necesitamos que el valor de la variable `id` sea la clave, n
139
139
140
140
### Los Symbols son omitidos en for..in
141
141
142
-
Las propiedades de Symbol no participan dentro de los ciclos `for..in`.
142
+
Las claves de Symbol no participan dentro de los ciclos `for..in`.
143
143
144
144
Por ejemplo:
145
145
@@ -152,16 +152,16 @@ let user = {
152
152
};
153
153
154
154
*!*
155
-
for (let key in user) alert(key); //name, age (no symbols)
155
+
for (let key in user) alert(key); //nombre, edad (no symbols)
156
156
*/!*
157
157
158
-
// el acceso directo a la propiedad de symbol funciona
158
+
// el acceso directo a la clave de symbol funciona
159
159
alert( "Direct: "+ user[id] );
160
160
```
161
161
162
-
Esto forma parte del concepto general de "ocultamiento". Si otro script o si otra librería itera el objeto este no accesará a la propiedad de Symbol.
162
+
Esto forma parte del concepto general de "ocultamiento". Si otro script o si otra librería itera el objeto este no accesará a la clave de Symbol.
163
163
164
-
En contraste, [Object.assign](mdn:js/Object/assign) copia las propiedades tanto del string como las del symbol:
164
+
En contraste, [Object.assign](mdn:js/Object/assign) copia las claves tanto del string como las del symbol:
165
165
166
166
```js run
167
167
let id =Symbol("id");
@@ -174,15 +174,15 @@ let clone = Object.assign({}, user);
174
174
alert( clone[id] ); // 123
175
175
```
176
176
177
-
No hay paradoja aquí, es así por diseño. La idea es que cuando clonamos un objeto o cuando fusionamos objetos, generalmente queremos que se copien *todas* las propiedades (incluidos los Symbol como `id`).
177
+
No hay paradoja aquí, es así por diseño. La idea es que cuando clonamos un objeto o cuando fusionamos objetos, generalmente queremos que se copien *todas* las claves (incluidos los Symbol como `id`).
178
178
179
179
## Symbols Globales
180
180
181
181
Como hemos visto, normalmente todos los Symbols son diferentes aunque tengan el mismo nombre. Pero algunas veces necesitamos que los symbol con el mismo nombre sean las mismas entidades.
182
182
183
-
Por ejemplo, distintas partes de nuestra aplicación quieren accesar a symbol `"id"` queriendo obtener el mismo valor de la propiedad.
183
+
Por ejemplo, distintas partes de nuestra aplicación quieren accesar a symbol `"id"` queriendo obtener el mismo valor de la clave.
184
184
185
-
Para lograr esto, existe un *global symbol registry*. Ahí podemos crear symbols y acceder después a ellos, lo cual nos garantiza que cada vez que se acceda a la propiedad con el mismo nombre, esta te devuelva exactamente el mismo symbol.
185
+
Para lograr esto, existe un *global symbol registry*. Ahí podemos crear symbols y acceder después a ellos, lo cual nos garantiza que cada vez que se acceda a la clave con el mismo nombre, esta te devuelva exactamente el mismo symbol.
186
186
187
187
Para crear u accesar a un symbol en el registro global, usa `Symbol.for(key)`.
188
188
@@ -216,29 +216,29 @@ Para los global symbols, no solo `Symbol.for(key)` devuelve un symbol por su nom
216
216
Por ejemplo:
217
217
218
218
```js run
219
-
// tomar symbol por name
220
-
let sym =Symbol.for("name");
219
+
// tomar symbol por nombre
220
+
let sym =Symbol.for("nombre");
221
221
let sym2 =Symbol.for("id");
222
222
223
223
// tomar name por symbol
224
-
alert( Symbol.keyFor(sym) ); //name
224
+
alert( Symbol.keyFor(sym) ); //nombre
225
225
alert( Symbol.keyFor(sym2) ); // id
226
226
```
227
227
228
-
El `Symbol.keyFor` utiliza internamente el registro "global symbol registry" para buscar la propiedad del symbol, por lo tanto, no funciona para los symbol que no están dentro del registro. Si el symbol no es global, no será capaz de encontrarlo y por lo tanto devolverá `undefined`.
228
+
El `Symbol.keyFor` utiliza internamente el registro "global symbol registry" para buscar la clave del symbol, por lo tanto, no funciona para los symbol que no están dentro del registro. Si el symbol no es global, no será capaz de encontrarlo y por lo tanto devolverá `undefined`.
229
229
230
-
Dicho esto, todo symbol tiene `description` de propiedad.
230
+
Dicho esto, todo symbol tiene `description` de clave.
231
231
232
232
Por ejemplo:
233
233
234
234
```js run
235
-
let globalSymbol =Symbol.for("name");
236
-
let localSymbol =Symbol("name");
235
+
let globalSymbol =Symbol.for("nombre");
236
+
let localSymbol =Symbol("nombre");
237
237
238
-
alert( Symbol.keyFor(globalSymbol) ); //name, global symbol
238
+
alert( Symbol.keyFor(globalSymbol) ); //nombre, global symbol
239
239
alert( Symbol.keyFor(localSymbol) ); // undefined, no global
240
240
241
-
alert( localSymbol.description ); //name
241
+
alert( localSymbol.description ); //nombre
242
242
```
243
243
244
244
## System symbols
@@ -267,11 +267,11 @@ Symbols son siempre valores distintos aunque tengan el mismo nombre. Si queremos
267
267
268
268
Symbols se utilizan principalmente en dos casos:
269
269
270
-
1.Propiedades "Ocultas" dentro de un objeto.
271
-
Si queremos agregar una propiedad a un objeto que "pertenezca" a otro script u otra librería, podemos crear un symbol y usarlo como propiedad. Una propiedad de symbol no aparecerá en los ciclos `for..in`,por lo que no aparecerá listada. Tampoco podrá ser accesada directamente por otro script porque este no tendrá nuestro symbol y no podrá intervenir en sus acciones.
270
+
1.Claves(keys) "Ocultas" dentro de un objeto.
271
+
Si queremos agregar una clave a un objeto que "pertenezca" a otro script u otra librería, podemos crear un symbol y usarlo como clave. Una clave de symbol no aparecerá en los ciclos `for..in`,por lo que no aparecerá listada. Tampoco podrá ser accesada directamente por otro script porque este no tendrá nuestro symbol y no podrá intervenir en sus acciones.
272
272
273
-
Podemos "ocultar" ciertos valores dentro de un objeto que solo estarán disponibles dentro de ese script usando las propiedades de symbol.
273
+
Podemos "ocultar" ciertos valores dentro de un objeto que solo estarán disponibles dentro de ese script usando las claves de symbol.
274
274
275
275
2. Existen diversos symbols del sistema que utiliza Javascript, a los cuales podemos accesar por medio de `Symbol.*`. Podemos usarlos para alterar algunos comportamientos. Por ejemplo, más adelante en el tutorial, usaremos `Symbol.iterator` para [iterables](info:iterable), `Symbol.toPrimitive` para configurar [object-to-primitive conversion](info:object-toprimitive).
276
276
277
-
Técnicamente, los symbols no están 100% ocultos. Existe un método incorporado [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) que nos permite obtener todos los symbols. También existe un método llamado [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) que devuelve *todas* las propiedades de un objeto, incluyendo las que son de tipo symbol. Por lo tanto, no están realmente ocultos, aunque la mayoría de las librerías, los métodos incorporados y las construcciones de sintaxis se adhieren a un acuerdo común de que sí lo están. Y el que explícitamente llama a los métodos antes mencionados probablemente entiende bien lo que está haciendo.
277
+
Técnicamente, los symbols no están 100% ocultos. Existe un método incorporado [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) que nos permite obtener todos los symbols. También existe un método llamado [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) que devuelve *todas* las claves de un objeto, incluyendo las que son de tipo symbol. Por lo tanto, no están realmente ocultos, aunque la mayoría de las librerías, los métodos incorporados y las construcciones de sintaxis se adhieren a un acuerdo común de que sí lo están. Y el que explícitamente llama a los métodos antes mencionados probablemente entiende bien lo que está haciendo.
0 commit comments