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
Conflicts are resolved for article.md from 08-symbol in the 04-object-basics section. index.md from the same section was updated.
Minor fix to the comments article from 03-code-quality.
Copy file name to clipboardExpand all lines: 1-js/03-code-quality/03-comments/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -173,7 +173,7 @@ Comentariile bune ne permit să păstrăm codul organizat, să ne întoarcem la
173
173
**Evită comentariile pentru:**
174
174
175
175
- Pentru a spune "cum funcționează codul" și "ce face".
176
-
- Punele înăuntru doar dacă este imposibil să faci codul atât de simplu și autodescriptiv încat să nu fie nevoie de ele.
176
+
- Punele înăuntru doar dacă este imposibil să faci codul atât de simplu și autodescriptiv încât să nu fie nevoie de ele.
177
177
178
178
179
179
Comentariile sunt de asemeni folosite pentru unelte de autodocumentare precum JSDoc3: acestea le citesc și generează documentații HTML (sau documentații în alt format).
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/08-symbol/article.md
+31-79Lines changed: 31 additions & 79 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,16 @@
1
1
2
2
# Tipul simbol ("symbol")
3
3
4
-
Conform specificațiilor, cheile proprietății obiectului pot fi fie de tip șir ("string"), fie de tip simbol ("symbol"). Nu numere, nu booleene, doar șiruri sau simboluri, aceste două tipuri.
4
+
Conform specificațiilor, doar două tipuri primitive pot servi drept chei de proprietăți ale obiectului:
5
5
6
-
Până acum am folosit doar șiruri. Acum să vedem ce avantaje ne oferă simbolurile.
6
+
- tipul string, sau
7
+
- tipul symbol.
8
+
9
+
În caz contrar, dacă cineva folosește alt tip, cum ar fi număr, este autoconvertit în string. Astfel `obj[1]` este același cu `obj["1"]`, și `obj[true]` este același cu `obj["true"]`.
10
+
11
+
Până acum am folosit doar string.
12
+
13
+
Acum haideți sa explorăm symbol, să vedem ce pot face ele pentru noi.
7
14
8
15
## Simboluri
9
16
@@ -12,19 +19,13 @@ Un "symbol" reprezintă un identificator unic.
12
19
O valoare de acest tip poate fi creată folosind `Symbol()`:
13
20
14
21
```js
15
-
// id-ul noului simbol
16
22
let id =Symbol();
17
23
```
18
24
19
-
După creare, putem aloca o descriere simbolului (mai numită și nume de simbol), folositoare îndeosebi pentru scopuri de depanare:
25
+
După creare, putem aloca o descriere simbolului (numită și symbol name), folositoare îndeosebi pentru scopuri de depanare:
Dacă sunteți familiari cu Ruby sau alt limbaj de programare ce are de asemenea orice fel de "simboluri" -- nu vă lăsați păcălit. Simbolurile JavaScript sunt diferite.
45
46
47
+
Așadar, pentru a rezuma, un simbol este o "valoare unică primitive" cu o descriere opțională. Haideți să vedem unde le putem folosi.
48
+
46
49
````warn header="Simbolurile nu se auto-convertesc la un șir"
47
50
Cele mai multe valori în JavaScript suportă conversie implicită la un șir. De exemplu, putem `alert`-a aproape orice valoare și va funcționa. Simbolurile sunt speciale. Ele nu se auto-convertesc.
48
51
@@ -55,13 +58,10 @@ alert(id); // TypeError: Cannot convert a Symbol value to a string
Aceasta este "protecția limbajului" ("language guard") împotriva stricăciunilor, deoarece șirurile și simbolurile sunt fundamental diferite și nu ar trebui convertite ocazional dintr-unul în altul.
60
-
=======
61
-
That's a "language guard" against messing up, because strings and symbols are fundamentally different and should not accidentally convert one into another.
Aceasta este un "language guard" împotriva încurcăturilor, deoarece string și symbol sunt fundamental diferite și nu ar trebui să se convertească din greșeală unul în celălalt.
63
62
64
63
Dacă vrem neapărat să afișăm un simbol, trebuie să apelăm explicit metoda `.toString()` a acestuia, ca aici:
Simbolurile ne permit să creăm proprietăți "ascunse" ale unui obiect, pe care nicio altă parte a codului nu le poate accesa sau suprascrie din greșeală.
89
85
90
86
De exemplu, dacă lucrăm cu obiecte `user`, ce fac parte din cod extern, am dori să le adăugăm identificatori.
91
87
@@ -105,13 +101,9 @@ alert( user[id] ); // putem accesa informația folosind simbolul ca și cheie
105
101
106
102
Care sunt avantajele folosirii `Symbol("id")` față de un șir `"id"`?
Deoarece obiectele `user` aparțin altui cod, și acel cod lucrează de asemenea cu acestea, nu ar trebui să adăugăm niciun câmp la ele. Este nesigur. Însă un simbol nu poate fi accesat accidental, codul extern, probabil, nici nu-l va vedea, deci pesemne este în regulă să o facem.
110
-
=======
111
-
As `user` objects belongs to another code, and that code also works with them, we shouldn't just add any fields to it. That's unsafe. But a symbol cannot be accessed accidentally, the third-party code probably won't even see it, so it's probably all right to do.
Deoarece obiectele `user` aparțin altui cod, nu este sigur să le adăugăm câmpuri, deoarece am putea afecta comportamentul predefinit în acel codebase. Cu toate acestea, simbolurile nu pot fi accesate din greșeală. Codul terților nu va fi conștient de simbolurile nou definite, deci este sigur să adăugăm symbol la obiectele `user`.
113
105
114
-
De asemenea, imaginați-vă că un alt script dorește să aibă propriul său identificator în interiorul obiectului `user`, pentru propriile sale scopuri. Poate fi o altă librărie JavaScript, astfel că script-urile nu știu unul de existența celuilalt.
106
+
De asemenea, imaginați-vă că un alt script dorește să aibă propriul său identificator în interiorul obiectului `user`, pentru propriile sale scopuri.
115
107
116
108
Apoi acel script își poate crea propriul `Symbol("id")`, ca aici:
`Object.keys(user)` le ignoră, de asemenea. Aceasta este o parte a principiului general "ascunderea proprietăților simbol". Dacă un alt script sau librărie iterează asupra obiectului, nu va accesa neașteptat o proprietate simbol.
191
-
=======
192
-
[Object.keys(user)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) also ignores them. That's a part of the general "hiding symbolic properties"principle. If another script or a library loops over our object, it won't unexpectedly access a symbolic property.
[Object.keys(user)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) le ignoră, de asemenea. Aceasta este o parte a principiului general "ascunderea proprietăților simbolice". Dacă un alt script sau librărie iterează asupra obiectului nostru, nu va accesa neașteptat o proprietate simbol.
194
174
195
175
În contrast, metoda [Object.assign](mdn:js/Object/assign) copiază proprietățile de ambele tipuri, șir și simbol:
196
176
@@ -207,27 +187,7 @@ alert( clone[id] ); // 123
207
187
208
188
Nu este niciun paradox aici. Așa este construit. Ideea este că, atunci când clonăm un obiect sau contopim obiecte, în mod normal vrem ca *toate* proprietățile să fie copiate (incluzând simboluri precum `id`).
După cum am văzut, în mod normal toate simbolurile sunt diferite, chiar dacă au același nume. Însă câteodată dorim ca simbolurile numite identic să fie aceleași entități. De exemplu, diferite părți ale aplicației noastre doresc să acceseze simbolul `"id"` care să însemne exact aceeași proprietate.
233
193
@@ -260,7 +220,7 @@ Simbolurile din interiorul registrului sunt denumite *simboluri globale*. Dacă
260
220
261
221
### Symbol.keyFor
262
222
263
-
Pentru simbolurile globale, nu numai `Symbol.for(key)` returnează un simbol după nume, dar există și un apel invers: `Symbol.keyFor(sym)`, care face reversul: returnează un nume după un simbol global.
223
+
Am văzut că pentru simbolurile globale, `Symbol.for(key)` returnează un simbol după nume. Pentru a face opusul -- să returnăm un nume pentru un simbol global -- putem folosi: `Symbol.keyFor(sym)`:
264
224
265
225
De exemplu:
266
226
@@ -274,11 +234,7 @@ alert( Symbol.keyFor(sym) ); // name
Metoda `Symbol.keyFor` folosește intern registrul global de simboluri pentru a căuta cheia simbolului. Deci nu funcționează pentru simboluri non-globale. Dacă simbolul nu este global, nu îl va putea găsi și va returna `undefined`.
279
-
=======
280
-
The `Symbol.keyFor` internally uses the global symbol registry to look up the key for the symbol. So it doesn't work for non-globalsymbols. If the symbol is not global, it won't be able to find it and returns `undefined`.
Acest `Symbol.keyFor` utilizează în mod intern registrul global de simboluri pentru a căuta cheia simbolului. Deci nu funcționează pentru simboluri non-globale. Dacă simbolul nu este global, nu îl va putea găsi și va returna `undefined`.
282
238
283
239
Acestea fiind spuse, orice simbol poate avea proprietatea `description`.
284
240
@@ -316,20 +272,16 @@ Alte simboluri vor deveni de asemenea familiare după ce vom studia caracteristi
316
272
317
273
Simbolurile sunt create cu apelul `Symbol()` cu o descriere opțională (name).
318
274
319
-
Simbolurile sunt întotdeauna valori diferite, chiar dacă au același nume. Dacă vrem ca simbolurile cu același nume să fie egale, atunci trebuie să folosim registrul global: `Symbol.for(key)` returnează (creează dacă este nevoie) un simbol global cu `cheie` ca și nume. Apelări multiple ale metodei `Symbol.for` aceeași `cheie` returnează exact același simbol.
275
+
Simbolurile sunt întotdeauna valori diferite, chiar dacă au același nume. Dacă vrem ca simbolurile cu același nume să fie egale, atunci trebuie să folosim registrul global: `Symbol.for(key)` returnează (creează dacă este nevoie) un simbol global cu `cheie` ca și nume. Apelări multiple a `Symbol.for`cu aceeași `key` returnează exact același simbol.
320
276
321
277
Simbolurile au două cazuri principale de folosire:
Dacă vrem să adăugăm o proprietate într-un obiect care "aparține" altui script sau biblioteci, putem crea un simbol și îl putem folosi ca și proprietate cheie. O proprietate simbolică nu apare în `for..in`, motiv pentru care, nu va fi procesată accidental împreună cu alte proprietăți. De asemenea, nu va fi accesată direct, deoarece un alt script nu va avea simbolul nostru. În concluzie, proprietatea va fi protejată împotriva folosirii sau rescrierii accidentale.
326
-
=======
327
-
1. "Hidden" object properties.
328
-
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.
Deci, putem ascunde "după cortină", în obiecte, ceva de care avem nevoie, dar alții nu ar trebui să vadă, folosind proprietăți simbol.
281
+
Dacă vrem să adăugăm o proprietate într-un obiect care "aparține" altui script sau un library, putem crea un simbol și îl putem folosi ca și property key. O proprietate simbolică nu apare în `for..in`, așa că nu va fi procesată accidental împreună cu alte proprietăți. De asemenea nu va fi accesată direct, deoarece un alt script nu are simbolul nostru. Așa că proprietatea va fi protejată împotriva utilizării sau suprascrierii accidentale.
282
+
283
+
Deci putem ascunde "după cortină" ceva în obiectele de care avem nevoie, dar pe care alții nu ar trebui să le vadă, folosind proprietăți simbolice.
332
284
333
-
2. Există multe simboluri sistem folosite de JavaScript care sunt accesibile prin `Symbol.*`. Le putem folosi pentru a altera comportamente incluse în limbaj. De exemplu, mai târziu în tutorial vom folosi `Symbol.iterator` pentru [iterables](info:iterable), `Symbol.toPrimitive` pentru a configura [object-to-primitive conversion](info:object-toprimitive) ș.a.m.d.
285
+
2. Există multe simboluri sistem folosite de JavaScript care sunt accesibile prin `Symbol.*`. Le putem folosi pentru a altera câteva comportamente incluse în limbaj. De exemplu, mai târziu în tutorial vom folosi `Symbol.iterator` pentru [iterabile](info:iterable), `Symbol.toPrimitive` pentru a configura [conversia object-to-primitive](info:object-toprimitive) ș.a.m.d.
334
286
335
-
Tehnic, simbolurile nu sunt 100% ascunse. Există metode ale limbajului JavaScript [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) care ne permit sa accesăm toate simbolurile. Mai există o metodă numită [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) care returnează *toate* cheile unui obiect incluzându-le și pe cele simbol. Deci ele nu sunt ascunse cu adevărat. Dar cele mai multe biblioteci, funcții incluse în limbaj și construcții de sintaxă nu folosesc aceste metode.
287
+
Tehnic, simbolurile nu sunt 100% ascunse. Există metode ale limbajului JavaScript [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) care ne permit sa accesăm toate simbolurile. Mai există o metodă numită [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) care returnează *toate* cheile unui obiect incluzându-le și pe cele simbolice. Dar cele mai multe librării, funcții built-in și construcții de sintaxă nu folosesc aceste metode.
0 commit comments