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
+14-86Lines changed: 14 additions & 86 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,22 +1,16 @@
1
1
2
2
# Type symbole
3
3
4
-
<<<<<<< HEAD
5
-
Par spécification, les clés de propriété d'objet peuvent être de type chaîne de caractères ou de type symbole. Pas des nombres, pas des booléens, uniquement des chaînes de caractères ou des symboles.
4
+
Par spécification, seuls deux types primitifs peuvent servir de clés de propriété d'objet :
6
5
7
-
Jusqu'à présent, nous n'avons vu que des chaînes de caractères. Voyons maintenant les avantages que les symboles peuvent nous apporter.
8
-
=======
9
-
By specification, only two primitive types may serve as object property keys:
6
+
- type string, ou
7
+
- type symbol.
10
8
11
-
- string type, or
12
-
- symbol type.
9
+
Sinon, si l'on utilise un autre type, tel que nombre, il est automatiquement converti en chaîne de caractères. Ainsi, `obj[1]` est identique à `obj["1"]`, et `obj[true]` est identique à `obj["true"]`.
13
10
14
-
Otherwise, if one uses another type, such as number, it's autoconverted to string. So that `obj[1]` is the same as `obj["1"]`, and `obj[true]` is the same as `obj["true"]`.
11
+
Jusqu'à présent, nous n'utilisions que des chaînes de caractères.
15
12
16
-
Until now we've been using only strings.
17
-
18
-
Now let's explore symbols, see what they can do for us.
19
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
13
+
Explorons maintenant les symboles, voyons ce qu'ils peuvent faire pour nous.
20
14
21
15
## Symboles
22
16
@@ -25,29 +19,17 @@ Un “Symbol” représente un identifiant unique.
25
19
Une valeur de ce type peut être créée en utilisant `Symbol()` :
26
20
27
21
```js
28
-
<<<<<<<HEAD
29
-
// id est un nouveau symbole
30
-
let id =Symbol();
31
-
```
32
-
33
-
Lors de la création, nous pouvons donner à symbole une description (également appelée nom de symbole), particulièrement utile pour le débogage :
34
-
=======
35
22
let id =Symbol();
36
23
```
37
24
38
-
Upon creation, we can give symbols a description (also called a symbol name), mostly useful for debugging purposes:
39
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
25
+
Lors de la création, nous pouvons donner au symbole une description (également appelée nom de symbole), particulièrement utile pour le débogage :
40
26
41
27
```js
42
28
// id est un symbole avec la description "id"
43
29
let id =Symbol("id");
44
30
```
45
31
46
-
<<<<<<< HEAD
47
32
Les symboles sont garantis d'être uniques. Même si nous créons beaucoup de symboles avec la même description, ce sont des valeurs différentes. La description est juste une étiquette qui n’affecte rien.
48
-
=======
49
-
Symbols are guaranteed to be unique. Even if we create many symbols with exactly the same description, they are different values. The description is just a label that doesn't affect anything.
50
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
51
33
52
34
Par exemple, voici deux symboles avec la même description -- ils ne sont pas égaux :
53
35
@@ -62,15 +44,10 @@ alert(id1 == id2); // false
62
44
63
45
Si vous connaissez Ruby ou un autre langage qui comporte également une sorte de "symboles", attention à ne pas vous tromper. Les symboles JavaScript sont différents.
64
46
65
-
<<<<<<< HEAD
47
+
Donc, pour résumer, un symbole est une "valeur unique primitive" avec une description facultative. Voyons où nous pouvons les utiliser.
48
+
66
49
````warn header="Les symboles ne se convertissent pas automatiquement en chaîne de caractères"
67
50
La plupart des valeurs de JavaScript prennent en charge la conversion implicite en chaîne de caractères. Par exemple, nous pouvons `alert` presque toutes les valeurs et cela fonctionnera. Les symboles sont spéciaux. Ils ne se convertissent pas automatiquement.
68
-
=======
69
-
So, to summarize, a symbol is a "primitive unique value" with an optional description. Let's see where we can use them.
70
-
71
-
````warn header="Symbols don't auto-convert to a string"
72
-
Most values in JavaScript support implicit conversion to a string. For instance, we can `alert` almost any value, and it will work. Symbols are special. They don't auto-convert.
73
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
74
51
75
52
Par exemple, cette `alert` affichera une erreur :
76
53
@@ -80,29 +57,18 @@ let id = Symbol("id");
80
57
alert(id); // TypeError: Impossible de convertir une valeur de symbole en chaîne de caractères
81
58
*/!*
82
59
```
83
-
C'est un "garde du langage" contre les erreurs, parce que les chaînes de caractères et les symboles sont fondamentalement différents et ne doivent accidentellement pas être convertis les uns en les autres.
60
+
C'est un "gardien du langage" contre les erreurs, parce que les chaînes de caractères et les symboles sont fondamentalement différents et ne doivent accidentellement pas être convertis les uns en les autres.
84
61
85
-
<<<<<<< HEAD
86
62
Si nous voulons vraiment afficher un symbole, nous devons appeler `.toString()` dessus, comme ici :
87
-
=======
88
-
That's a "language guard" against messing up, because strings and symbols are fundamentally different and should not accidentally convert one into another.
89
63
90
-
If we really want to show a symbol, we need to explicitly call `.toString()` on it, like here:
91
-
92
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
93
64
```js run
94
65
let id = Symbol("id");
95
66
*!*
96
67
alert(id.toString()); // Symbol(id), maintenant ça marche
97
68
*/!*
98
69
```
99
-
<<<<<<< HEAD
100
70
Ou récupérer la propriété `symbol.description` pour afficher la description uniquement :
101
-
=======
102
-
103
-
Or get `symbol.description` property to show the description only:
104
71
105
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
106
72
```js run
107
73
let id = Symbol("id");
108
74
*!*
@@ -114,12 +80,7 @@ alert(id.description); // id
114
80
115
81
## Propriétés "cachées"
116
82
117
-
<<<<<<< HEAD
118
83
Les symboles nous permettent de créer des propriétés "cachées" d'un objet, qu'aucune autre partie du code ne peut accéder accidentellement ou écraser.
119
-
=======
120
-
121
-
Symbols allow us to create "hidden" properties of an object, that no other part of code can accidentally access or overwrite.
122
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
123
84
124
85
Par exemple, si nous travaillons avec des objets `user` qui appartiennent à un code tiers, nous aimerions leur ajouter des identificateurs.
125
86
@@ -139,17 +100,11 @@ alert( user[id] ); // nous pouvons accéder aux données en utilisant le symbole
139
100
140
101
Quel est l’avantage de l’utilisation de `Symbol("id")` sur une chaîne de caractères `"id"` ?
141
102
142
-
<<<<<<< HEAD
143
103
Poussons un peu plus loin l’exemple pour voir cela.
144
104
145
-
Comme les objets `user` appartiennent à un autre code et que ce code fonctionne également avec eux, nous ne devrions pas simplement y ajouter de champs. C’est dangereux. Cependant, il est parfois impossible d’accéder à un symbole. Mais un symbole ne peut pas être accédé accidentellement, le code tiers ne le verra probablement même pas, il est donc probablement correct de le faire.
146
-
=======
147
-
As `user` objects belong to another codebase, it's unsafe to add fields to them, since we might affect pre-defined behavior in that other codebase. However, symbols cannot be accessed accidentally. The third-party code won't be aware of newly defined symbols, so it's safe to add symbols to the `user` objects.
105
+
Comme les objets `user` appartiennent à une autre base de code, il n'est pas sûr de leur ajouter des champs, car nous pourrions affecter le comportement prédéfini dans cette autre base de code. Cependant, les symboles ne peuvent pas être accédés accidentellement. Le code tiers ne sera pas conscient des symboles nouvellement définis, il est donc prudent d'ajouter des symboles aux objets `user`.
148
106
149
-
Also, imagine that another script wants to have its own identifier inside `user`, for its own purposes.
150
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
151
-
152
-
Imaginez qu'un autre script veuille avoir son propre identifiant à l'intérieur de `user`, pour sa propre utilisation. Cela peut être une autre bibliothèque JavaScript, donc les scripts ne sont absolument pas conscients les uns des autres.
107
+
Imaginez qu'un autre script veuille avoir son propre identifiant à l'intérieur de `user`, pour sa propre utilisation.
153
108
154
109
Ensuite, ce script peut créer son propre `symbol("id")`, comme ceci :
155
110
@@ -213,13 +168,8 @@ let user = {
213
168
for (let key in user) alert(key); // name, age (pas de symboles)
214
169
*/!*
215
170
216
-
<<<<<<<HEAD
217
171
// l'accès direct par le symbole fonctionne
218
-
alert( "Direct: "+ user[id] );
219
-
=======
220
-
// the direct access by the symbol works
221
172
alert( "Direct: "+ user[id] ); // Direct: 123
222
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
223
173
```
224
174
225
175
[Object.keys(user)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) les ignore également. Cela fait partie du principe général du "dissimulation des propriétés symboliques". Si un autre script ou une bibliothèque parcourt notre objet, il n’accédera pas de manière inattendue à une propriété symbolique.
@@ -267,20 +217,12 @@ Les symboles à l'intérieur de ce registre sont appelés *symboles globaux*. Si
267
217
```smart header="Cela ressemble à Ruby"
268
218
Dans certains langages de programmation, comme Ruby, il existe un seul symbole par nom.
269
219
270
-
<<<<<<< HEAD
271
-
Comme nous pouvons le constater, en JavaScript, c’est bien pour les symboles globaux.
272
-
=======
273
-
In JavaScript, as we can see, that's true for global symbols.
274
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
220
+
Comme nous pouvons le constater, en JavaScript, c’est vrai pour les symboles globaux.
275
221
```
276
222
277
223
### Symbol.keyFor
278
224
279
-
<<<<<<< HEAD
280
-
Pour les symboles globaux, pas seulement `Symbol.for(key)` renvoie un symbole par son nom, mais il existe un appel inversé : `Symbol.keyFor(sym)`, cela fait l'inverse: retourne un nom par un symbole global.
281
-
=======
282
-
We have seen that for global symbols, `Symbol.for(key)` returns a symbol by name. To do the opposite -- return a name by global symbol -- we can use: `Symbol.keyFor(sym)`:
283
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
225
+
Nous avons vu que pour les symboles globaux, `Symbol.for(key)` renvoie un symbole par son nom. Pour faire le contraire -- retourner un nom par symbole global -- nous pouvons utiliser : `Symbol.keyFor(sym)` :
284
226
285
227
Par exemple :
286
228
@@ -296,11 +238,7 @@ alert( Symbol.keyFor(sym2) ); // id
296
238
297
239
`Symbol.keyFor` utilise en interne le registre de symboles global pour rechercher la clé du symbole. Donc, cela ne fonctionne pas pour les symboles non globaux. Si le symbole n’est pas global, il ne pourra pas le trouver et retournera `undefined`.
298
240
299
-
<<<<<<< HEAD
300
241
Cela dit, tous les symboles ont la propriété `description`.
301
-
=======
302
-
That said, all symbols have the `description` property.
303
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
304
242
305
243
Par exemple :
306
244
@@ -341,21 +279,11 @@ Les multiples appels de `Symbol.for` avec la même `key` renvoient exactement le
341
279
342
280
Les symboles ont deux principaux cas d'utilisation :
343
281
344
-
<<<<<<< HEAD
345
282
1. Propriétés d'objet "masquées".
346
283
Si nous voulons ajouter une propriété à un objet qui "appartient" à un autre script ou à une librairie, nous pouvons créer un symbole et l'utiliser comme clé de propriété. Une propriété symbolique n’apparait pas dans `for..in`, elle ne sera donc pas traitée accidentellement avec d'autres propriétés. De plus, elle ne sera pas accessible directement, car un autre script n’a pas notre symbole. Ainsi, la propriété sera protégée contre une utilisation accidntelle ou un écrasement.
347
-
=======
348
-
1. "Hidden" object properties.
349
-
350
-
If we want to add a property into an object that "belongs" to another script or a library, we can create a symbol and use it as a property key. A symbolic property does not appear in `for..in`, so it won't be accidentally processed together with other properties. Also it won't be accessed directly, because another script does not have our symbol. So the property will be protected from accidental use or overwrite.
351
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
352
284
353
285
Ainsi, nous pouvons "dissimuler" quelque chose dans des objets dont nous avons besoin, mais que les autres ne devraient pas voir, en utilisant des propriétés symboliques.
354
286
355
287
2. De nombreux symboles système utilisés par JavaScript sont accessibles en tant que `Symbol.*`. Nous pouvons les utiliser pour modifier certains comportements internes. Par exemple, plus tard dans le tutoriel, nous utiliserons `Symbol.iterator` pour [iterables](info:iterable), `Symbol.toPrimitive` etc.
356
288
357
-
<<<<<<< HEAD
358
289
Techniquement, les symboles ne sont pas cachés à 100%. Il y a une méthode intégrée [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) qui nous permet d’obtenir tous les symboles. Il y a aussi une méthode nommée [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) qui renvoie *toutes* les clés d'un objet, y compris celles symboliques. Donc, ils ne sont pas vraiment cachés. Mais la plupart des bibliothèques, fonctions intégrées et structures de syntaxe n'utilisent pas ces méthodes.
359
-
=======
360
-
Technically, symbols are not 100% hidden. There is a built-in method [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) that allows us to get all symbols. Also there is a method named [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) that returns *all* keys of an object including symbolic ones. But most libraries, built-in functions and syntax constructs don't use these methods.
0 commit comments