Skip to content

Commit 74ae98a

Browse files
committed
RegExp-urile și Symbol au multe lucruri în comun
1 parent 15c3ce3 commit 74ae98a

File tree

5 files changed

+66
-29
lines changed

5 files changed

+66
-29
lines changed
Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Array.prototype.concat() - nu afectează array-ul
1+
# `Array.prototype.concat()` - nu afectează array-ul
22

3-
Realizează o „copie simplă” (shallow copy) formată din elementele array-ului asupra căruia se invocă metoda și elementele care se doresc a fi adăugate.
3+
Realizează o „copie simplă” (*shallow copy*) formată din elementele array-ului asupra căruia se invocă metoda și elementele care se doresc a fi adăugate.
44

55
```javascript
66
var arr = [1, 2, 3];
@@ -12,23 +12,29 @@ arr.concat([4, [5, 6]]);// returnează Array [ 1, 2, 3, 4, Array[2] ]
1212
arr.concat([4, [5, 6], 7, 8, [9, 10]]); // returnează Array [ 1, 2, 3, 4, Array[2], 7, 8, Array[2] ]
1313
```
1414

15-
Ceea ce trebuie remarcat este faptul că operațiunea concat realizează o „desfacere” a unui array și alipirea valorilor sale, dacă acesta este poziționat primul. Un array poziționat dincolo de prima valoare, va fi introdus ca array și nu ca valorile sale.
15+
Ceea ce trebuie remarcat este faptul că operațiunea concat realizează o „desfacere” a unui array și alipirea valorilor sale, dacă acesta este poziționat primul. Un array poziționat dincolo de prima valoare, va fi introdus ca array și valorile sale în mod direct.
1616

1717
Elementele array-urilor originale sunt copiate în noul array format respectându-se următoarele reguli:
1818
- în cazul obiectelor sunt copiate referințe către acestea, nu obiectele în sine. Dacă un obiect referențiat este modificat, se va reflecta în array-ul original și cel nou format.
19-
- în cazul șirurilor și numerelor, acestea vor fi copiate în noul array. Modificarea valorilor din array-urile originale nu se vor răsfrânge în cel nou constituit.
19+
- în cazul *șirurilor de caractere* și a *numerelor*, acestea vor fi copiate în noul array. Modificarea valorilor din array-urile originale nu se vor răsfrânge în cel nou constituit.
20+
21+
La un array se pot adăuga elemente în mod direct folosindu-se `concat` prin pasarea unui al doilea argument.
22+
23+
```javascript
24+
var arr = [1, 2, 3];
25+
arr.concat("ceva");
26+
console.log(arr);
27+
// [ 1, 2, 3, "ceva" ]
28+
```
2029

2130
![Array.prototype.concat()](ArrayConcat.svg)
2231

23-
Se poate chiar construi o funcție concat folosind slice, dar care să facă concat pe argumentele pasate.
32+
Se poate chiar construi o funcție `concat` folosind `slice`, dar care să facă concat pe argumentele pasate.
2433

2534
```javascript
26-
2735
function concat () {
2836
return Array.prototype.slice.call(arguments).join(' ');
2937
};
30-
3138
var sirNou = concat('ceva', 'text', 'pentru', 'a', 'fi', 'unit');
32-
3339
console.log(sirNou);
3440
```

obiecte/obiecte-interne-standard/RegExp/RegExp.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ Să spunem că un fragment de text începe cu un caracter ales de tine sau un ș
125125
Fără acest fanion, va fi returnată doar prima potrivire care se face.
126126
Folosind fanionul, se va face potrivire pe tot ce seamănă cu secvența șablonul.
127127

128-
### Proprietăți ale obiectului `RegExp`
128+
### Proprietăți ale obiectului prototip a lui `RegExp`
129129

130130
Aceste proprietăți sunt foarte utile atunci când dorești să afli starea în care se află obiectul regex la un anumit moment dat.
131131

@@ -263,7 +263,7 @@ console.dir(cautare);
263263

264264
Fără niciun fanion specificat, se va face regărirea primului caracter din set, când acesta este întâlnit în șir. Căutarea se va opri aici. Folosirea fanionului `g`, va avea ca efect căutarea în întreg șirul după fiecare caracter din setul specificat.
265265

266-
Regex-ul permite folosirea unui caracter special, linia, care va specifica limitele setului. Un bun exemplu este căutarea prin întreg setul de caractere de la a la z: `[a-z]` sau majusculele `[A-Z]` ori cifrele `[0-9]`. Caracterul liniuță spune Regex-ului să constituie un ***set***. O mică precizare pentru a elimina confuziile: pentru a face potrivire după însăși caracterul `-`, trebuie precedate de backslash. Atenție, potrivirea se va face după un singur caracter din acel set, nu după toate sau mai simplu, este răspunsul la întrebarea: caracterul la care mă uit se regăsește în acest set?
266+
Regex-ul permite folosirea unui caracter special, linia, care va specifica limitele setului. Un bun exemplu este căutarea prin întreg setul de caractere de la a la z: `[a-z]` sau majusculele `[A-Z]` ori cifrele `[0-9]`. Caracterul liniuță spune RegExp-ului să constituie un ***set***. O mică precizare pentru a elimina confuziile: pentru a face potrivire după însăși caracterul `-`, trebuie precedate de backslash. Atenție, potrivirea se va face după un singur caracter din acel set, nu după toate sau mai simplu, este răspunsul la întrebarea: caracterul la care mă uit se regăsește în acest set?
267267

268268
### Metacaracterele în seturi
269269

@@ -355,7 +355,7 @@ console.log(sir.match(sablon));
355355

356356
Acest lucru se petrece pentru că punctul consideră prima croșetă care în gândirea noastră ar trebui să închidă parcurgerea șirului drept un caracter oarecare și va vontinua cu toate celelalte până când va ajunge la poziția de după ultimul caracter. Abia atunci motorul RegExp va privi ultimul caracter și-l va compara cu cel din regex pentru a vedea dacă este ce caută pentru a satisface șablonul. Dacă mai sunt alte caractere diferite de `>`, pur și simplu se va întoarce înapoi pe cărare și la primul caracter `>` va returna ca potrivire. Operațiunea de a merge înapoi pe șir pentru a satisface căutarea se numește `backtracking` (back înseamnă „înapoi” și tracking „a urma”). După ce a făcut backtracking, va returna „nerăbdător” ceea ce a găsit.
357357

358-
Cum transformi comportamentul expansiv (greedy) într-unul autosuficient? Adaugi imediat după plus cuantificatorul `?`
358+
Cum transformi comportamentul expansiv (**greedy**) într-unul autosuficient? Adaugi imediat după plus cuantificatorul `?`
359359

360360
```javascript
361361
var sir = '<p>Un <cite>citat.</cite></p>';
@@ -374,7 +374,7 @@ var cautare = sir.match(/pământ?/gi);
374374
console.dir(cautare); // apare de 2 ori
375375
```
376376

377-
De fapt, nu e chiar atât de inteligent regex-ul, ci doar spune că acea combinație de caractere trebuie să apară în șir cuantificându-se de câte ori apare indiferent ce precede sau cu ce continuă.
377+
De fapt, nu e chiar atât de inteligent RegExp-ul, ci doar spune că acea combinație de caractere trebuie să apară în șir numărându-se de câte ori apare indiferent ce precede sau cu ce continuă.
378378

379379
Un strop de inteligență ar fi să introduci alternative într-un grup, care, la rândul său să existe sau nu.
380380

@@ -394,7 +394,7 @@ console.log(sir.match(sablon));
394394
// ["octombrie","oct"]
395395
```
396396

397-
Ceea ce se mai observă este că metacaracterul `?` este unul care implică comportamentul expansiv (greedy). De ce? Pentru că spune motorului că musai trebuie să potrivească șablonul ca mai apoi să se dea bătut dacă acesta are corespondent în string. Pentru a face șablonul autosuficient (lazzy), ar trebui să mai pui un metacaracter `?` după primul.
397+
Ceea ce se mai observă este că metacaracterul `?` este unul care implică comportamentul expansiv (**greedy**). De ce? Pentru că spune motorului că musai trebuie să potrivească șablonul ca mai apoi să se dea bătut dacă acesta are corespondent în string. Pentru a face șablonul autosuficient (**lazzy**), ar trebui să mai pui un metacaracter `?` după primul.
398398

399399
Cuantificatorul `*` este combinația celor dinainte. Este și el un cuantificator expansiv încercând să consume întreaga resursă de șir.
400400

@@ -608,7 +608,7 @@ obi;
608608

609609
Acesta este un caz foarte simplu în care dacă avem elemente de același fel acestea se vor suprascrie în obiect.
610610

611-
### Backreferencing
611+
### Backreferencing - căutare înapoi cu un pas
612612

613613
Gruparea activează un mecanism de memorizare care ține minte șirul de caractere pentru secvența șablonului dintre parantezele rotunde. Mecanismul de memorizare poate fi anulat la nevoie. Nu uita faptul că memorizarea (***backreference***) taxează ca și resurse. Dacă nu ai nevoie de ea, anuleaz-o. De exemplu, în `bună(stare)?`, fragmentul memorizat, la momentul extragerii din șir va fi `stare`. Pentru a renunța la memorizare pui imediat după deschiderea parantezei rotunde a grupului sintaxa specială semnul întrebării și două puncte: `?:`. Astfel, șablonul va deveni `bună(?:stare)?`. Sintaxa `?:` spune motorului să nu folosească capturarea, memorizarea.
614614

@@ -644,7 +644,7 @@ console.log(sir.match(sablon));
644644
// [Array] ["scris scris","scris"]
645645
```
646646

647-
## Lookahead pozitiv și negativ
647+
## Lookahead pozitiv și negativ - căutarea cu anticipare
648648

649649
Am menționat deja că un șablon `a(?=b)` indică motorului RegExp faptul că trebuie să avanseze pe șir pentru a satisface potrivirea lui a urmat imediat de `b` așa cum avem acum.
650650

@@ -669,7 +669,7 @@ console.log(sir.match(sir));
669669

670670
Șabloanele regex fac casă bună cu anumite metodele ale obiectului intern String.
671671

672-
### Căutarea cu `search`
672+
### Căutarea folosind metoda `search(șablon)`
673673

674674
Metoda specializată acceptă drept argument un șablon regex pentru a face căutări.
675675

@@ -680,7 +680,7 @@ ceva.search(/orice/); // 14
680680

681681
Este returnat indexul la care apare pentru prima dată combinația specificată de șablon. De ce nu a luat în considerare și primul cuvânt? Pentru că litera o este o majusculă care are nevoie de alt șablon. Prima secvență care se potrivește perfect este la indexul 4 al șirului.
682682

683-
### Căutare cu `match`
683+
### Căutarea folosind metoda `match(șablon)`
684684

685685
Rezultatul unei căutări pe șir cu metoda `match` a obiectului intern `String`.
686686

@@ -693,9 +693,9 @@ console.dir(potriviri);
693693
Rezultatul este un array, care are valoarea 14 pentru `index` și la `input` întreg șirul.
694694
Dacă este activat fanionul `g`, regăsirea se va face pe tot șirul în toate combinațiile posibile și se va completa array-ul cu toate aceste variante.
695695

696-
### Înlocuiri simple de șiruri - `replace`
696+
### Înlocuirea unui șir folosind metoda `replace(șablon, înlocuitor)`
697697

698-
Adeseori regex-urile sunt cuplate cu metoda replace a obiectului intern `String`.
698+
Adeseori regex-urile sunt cuplate cu metoda `replace` a obiectului intern `String`.
699699

700700
```javascript
701701
var ceva = 'caut ceva';

obiecte/obiecte-interne-standard/String/prototype-string-methods/String.prototype.concat.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var nucleu = "Salutare, ";
77
console.log(nucleu.concat('prietene,', ' ce mai faci?')); // Salutare, prietene, ce mai faci?
88
```
99

10-
Același efect poate fi obținut cu următoarea secvență de cod, care de această dată construiește o funcție concat și care operează asupra array-like-ului `arguments`:
10+
Același efect poate fi obținut cu următoarea secvență de cod, care de această dată construiește o funcție `concat` și care operează asupra array-like-ului `arguments`:
1111

1212
```javascript
1313
function concat () {
@@ -17,7 +17,7 @@ var sirNou = concat('ceva', 'text', 'pentru', 'a', 'fi', 'unit')
1717
console.log(sirNou); // ceva text pentru a fi unit
1818
```
1919

20-
Folosirea `rest parameters`, adică o sintaxă ce permite extragerea unui Array din argumentele pasate unei funcții. Această sintaxă constă din adăugarea unui nume de parametru prefixat de trei puncte de suspensie. Această sintaxă generează un Array adevărat, nu un array-like așa cum este `arguments`.
20+
Folosirea `rest parameters`, adică o sintaxă ce permite extragerea unui Array din argumentele pasate unei funcții. Această sintaxă constă din adăugarea unui nume de parametru prefixat de trei puncte de suspensie. Această sintaxă generează un array adevărat, nu un *array-like* așa cum este `arguments`.
2121

2222
```javascript
2323
function concat (...argumentePasate){

obiecte/obiecte-interne-standard/Symbol/Symbol.md

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,44 @@ Prin ce se disting *simbolurile binecunoscute* de celelalte? Prin faptul că sun
159159

160160
Acesta este cazul operatorului `instanceof` prin care putem afla dacă un anumit obiect este o instanță a celui pentru care se face investigația.
161161

162+
```javascript
163+
var obi = {x: true};
164+
obi instanceof Object; // true
165+
// echivalent cu
166+
Object[Symbol.hasInstance](obi);
167+
```
168+
169+
Concluzia este că operatorul `instanceof` începând cu ECMAScript 6 a devenit o prescurtare către metoda `hasInstance` a lui `Symbol`. În acest caz, toate funcțiile în JavaScript vor avea o metodă `Symbol.hasInstance` prin care se poate testa dacă un obiecte este sau nu o instanță a acesteia. Această metodă este chiar în obiectul prototip al lui `Function` (`Function.prototype`), ceea ce face ca toate funcțiile să o moștenească. Proprietatea `Symbol.hasInstance` este non-writable, nonconfigurable și nonenumerable pentru a se asigura faptul că nu va fi suprascrisă dintr-o eroare. Totuși, fii foarte atent că prin utilizarea metodei `Object.defineProperty()`, poți modifica fără probleme `Symbol.hasInstance`.
170+
162171
### `Symbol.isConcatSpreadable`
163172

164-
Aceasta este o valoare boolean. Ceea ce indică ea este dacă un obiect poate fi transformat într-un array ce conține proprietățile sale atunci când se invocă `concat` pe un array existent. Adu-ți aminte că un array este la rândul său un obiect, de fapt. Acest simbol dă girul că obiectul poate fi tratat ca un array căruia urmează să i se adauge noi elemente.
173+
Aceasta este o valoare boolean. Ceea ce indică ea este dacă un obiect poate fi transformat într-un array ce conține proprietățile sale atunci când se invocă `concat` pe un array existent. Adu-ți aminte că un array este la rândul său un obiect, de fapt. Acest simbol dă girul că obiectul poate fi tratat ca un array căruia urmează să se adauge ca elemente noi la un array pe care se face `concat`-ul.
174+
175+
```javascript
176+
var obiSimulandUnArray = {
177+
0: "unu",
178+
1: "doi",
179+
length: 2,
180+
[Symbol.isConcatSpreadable]: true
181+
};
182+
// obiSimulandUnArray are acum comportament de array
183+
var numaram = ["zero"].concat(obiSimulandUnArray);
184+
console.log(numaram); // [ "zero", "unu", "doi" ]
185+
```
165186

166187
### `Symbol.iterator`
167188

168189
Acest simbol este mijlocul prin care se aplează iteratorul pentru un anumit obiect. Este binecunoscută apelarea iteratorului atunci când se folosește `for...of`.
169190

191+
### Expunerea metodelor prin care se realizează interacțiuni cu textul
192+
193+
Există patru metode a constructorului `Symbol`, care permit o posibilă interacțiune și mai intimă cu modul în care sunt exploatate textele folosind regex-urile. Pentru a înțelege ce oferă metodele lui Symbol, să trecem în revistă metodele utilizate de obiectul intern `RegExp`.
194+
195+
- `match(șablonRegExp)` prin care se verifică dacă un șir de caractere este identic cu cel menționat prin șablonul regex-ului.
196+
- `replace(șablonRegExp, șirDeÎnlocuire)` prin care se caută un fragment identic cu cel menționat de regex, iar atunci când este găsit, se face înlocuirea sa cu șirul de caractere introdus ca al doilea argument.
197+
- `search(șablonRegExp)` localizează un fragment menționat prin șablonul regex-ului în interiorul unui text.
198+
- `split(șablonRegExp)` „sparge” un șir de caractere într-un array pe baza potrivirii după un șablon menționat prin regex.
199+
170200
### `Symbol.match`
171201

172202
Este simbolul care pune în funcțiune algoritmii responsabili cu realizarea unei căutări într-un șir de caractere după un șablon. Este apelabil prin invocarea metodei `match()` pusă la dispoziție de obiectul intern RegExp.
@@ -179,14 +209,14 @@ Este simbolul care pune în funcțiune algoritmii responsabili cu realizarea une
179209

180210
Este mecanismul declanțat la căutarea într-un șir după un șablon atunci când este apelată metoda `search()` a lui RegExp.
181211

182-
### `Symbol.species`
183-
184-
Este o valoare implicată în crearea de obiecte derivate.
185-
186212
### `Symbol.split`
187213

188214
Este algoritmul care se pune în mișcare la apelarea metodei `split()` pe care obiectul intern String o pune la dispoziție.
189215

216+
### `Symbol.species`
217+
218+
Este o valoare implicată în crearea de obiecte derivate.
219+
190220
### `Symbol.toPrimitive`
191221

192222
Un simbol utilizat pentru a converti un obiect la o primitivă. Standardul îl menționează, dar încă nu există aplicații practice.

operatori/operatori-de-relatie.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ var obi = {a: 1, b: 2};
2525

2626
## Operatorul `instanceof`
2727

28-
Acest operator testează dacă în lanțul prototipal al unui obiect se află proprietatea `prototype` a unui constructor.
28+
Acest operator testează dacă în lanțul prototipal al unui obiect se află proprietatea `prototype` a unui constructor. Începând cu ECMAScript 6, operatorul `instanceof` este o prescurtare care apelează metoda `hasInstance` a constructorului `Symbol`. Toate funcțiile au o metodă `Symbol.hasInstance` cu ajutorul căreia se poate verifica dacă un anume obiect este sau nu o instanță a acelei funcții.
2929

3030
```javascript
31-
function EX(){};
31+
function EX () {};
3232
var obiX = new EX();
3333

3434
Object.getPrototypeOf(obiX); // prototype este Object
@@ -50,8 +50,9 @@ Dacă este nevoie poți seta proprietatea `prototype` la un obiect diferit de ce
5050
EX.prototype = {};
5151
```
5252

53-
Nu uita portotipul unui obiect se mai poate seta și cu `Object.setPrototypeOf(obiectul)`.
53+
Adu-ți mereu aminte prototipul unui obiect se mai poate seta și cu `Object.setPrototypeOf(obiectul)`.
5454

5555
## Mantre
5656

5757
- Un obiect literal are prototype `undefined`. Cu toate acestea la interogare cu instanceof trimite la Object.
58+
- `instanceof` este o prescurtare care apelează metoda `hasInstance` a constructorului `Symbol`.

0 commit comments

Comments
 (0)