Skip to content

Commit ad141d7

Browse files
authored
Merge pull request #216 from Dorin-David/Articolo/object-primitive-conversion
revisione articolo objects to primitive conversion
2 parents 355b255 + 5e37864 commit ad141d7

File tree

1 file changed

+49
-21
lines changed
  • 1-js/04-object-basics/09-object-toprimitive

1 file changed

+49
-21
lines changed

1-js/04-object-basics/09-object-toprimitive/article.md

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11

2-
# Conversione da oggetto a primitiva
2+
# Conversione da oggetto a primitivi
33

4-
Cosa acca de quando degli oggetti vengono sommati `obj1 + obj2`, sottratti `obj1 - obj2` o stampati tramite `alert(obj)`?
4+
Cosa accade quando degli oggetti vengono sommati `obj1 + obj2`, sottratti `obj1 - obj2` o mostrati tramite `alert(obj)`?
55

6-
In questo caso gli oggetti vengono auto convertiti a primitivi, e successivamente viene gestita l'operazione.
6+
In questo caso gli oggetti vengono auto convertiti a primitivi; successivamente viene gestita l'operazione.
77

8-
Nel capitolo <info:type-conversions> abbiamo visto le regole per quelle di tipo numerico, string e boolean. Però abbiamo lasciato un vuoto riguardo gli oggetti. Adesso che conosciamo i metodi e i symbol diventa più semplice parlarne.
8+
Nel capitolo <info:type-conversions> abbiamo visto le regole per le conversioni dei primitivi di tipo numerico, stringa e booleano. Però abbiamo lasciato un vuoto riguardo gli oggetti. Adesso che conosciamo i metodi e i symbol diventa più semplice parlarne.
99

10-
1. Tutti gli oggetti sono `true` in un contesto booleano. Ci sono solamente conversioni numeriche e a stringhe.
10+
1. Tutti gli oggetti sono `true` in contesto booleano. Ci sono solamente conversioni numeriche e a stringhe.
1111
2. La conversione numerica avviene quando eseguiamo una sottrazione tra oggetti oppure applichiamo funzioni matematiche. Ad esempio, gli oggetti `Date` (che studieremo nel capitolo <info:date>) possono essere sottratti, ed il risultato di `date1 - date2` è la differenza di tempo tra le due date.
12-
3. Le conversioni a stringa -- solitamente accadono quando stampiamo un oggetto come `alert(obj)` e in altri contesti simili.
12+
3. Le conversioni a stringa -- solitamente avvengono quando mostriamo un oggetto, come in `alert(obj)` e in altri contesti simili.
1313

1414
## ToPrimitive
1515

1616
Possiamo gestire la conversione numerica o a stringa, utilizzando dei metodi speciali dell'oggetto.
1717

18-
L'algoritmo di conversione si chiama `ToPrimitive` ([specification](https://tc39.github.io/ecma262/#sec-toprimitive)). In base al contesto, la conversione viene definita "hint" ("suggerimento").
18+
L'algoritmo di conversione si chiama `ToPrimitive`. In base al contesto, la conversione viene definita "hint" ("suggerimento"), ed è descritta nella ([specification](https://tc39.github.io/ecma262/#sec-toprimitive)).
1919

2020
Ci sono tre varianti:
2121

2222
`"string"`
23-
: Un operazione di conversione oggetto a stringa, avviene quando un operazione si apetta una stringa, come `alert`:
23+
: Un'operazione di conversione oggetto a stringa, avviene quando un operazione si aspetta una stringa, come `alert`:
2424

2525
```js
2626
// output
@@ -46,7 +46,7 @@ Ci sono tre varianti:
4646
```
4747

4848
`"default"`
49-
: Utilizzata in casi rari quando l'operatore "non è sicuro" del tipo necessario.
49+
: Utilizzata in casi rari quando l'operatore "non è sicuro" del tipo da aspettarsi.
5050

5151
Ad esempio, la somma binaria `+` può essere utilizzata sia con le stringhe (per concatenarle) sia con i numeri (per eseguire la somma), quindi sia la conversione a stringa che quella a tipo numerico potrebbero andare bene. Oppure quando un oggetto viene confrontato usando `==` con una stringa, un numero o un symbol.
5252

@@ -67,7 +67,7 @@ Notate -- ci sono solo tre hint. Semplice. Non esiste alcuna conversione al tipo
6767
**Per eseguire la conversione JavaScript tenta di chiamare tre metodi dell'oggetto:**
6868

6969
1. Chiama `obj[Symbol.toPrimitive](hint)` se il metodo esiste,
70-
2. Altrimenti se "hint" è di tipo `"string"`
70+
2. Altrimenti, se "hint" è di tipo `"string"`
7171
- prova `obj.toString()` e `obj.valueOf()`, sempre se esistono.
7272
3. Altrimenti se "hint" è di tipo `"number"` o `"default"`
7373
- prova `obj.valueOf()` and `obj.toString()`, sempre se esistono.
@@ -102,14 +102,14 @@ alert(+user); // hint: number -> 1000
102102
alert(user + 500); // hint: default -> 1500
103103
```
104104

105-
Come possiamo vedere dal codice, `user` diventa una stringa auto-descrittiva o una quantità di soldi, in base al tipo di conversione. Il semplice metodo `user[Symbol.toPrimitive]` gestisce tutte le conversioni.
105+
Come possiamo vedere nel codice, `user` diventa una stringa auto-descrittiva o una quantità di soldi, in base al tipo di conversione. Il semplice metodo `user[Symbol.toPrimitive]` gestisce tutte le conversioni.
106106

107107

108108
## toString/valueOf
109109

110110
I metodi `toString` e `valueOf` sono molto vecchi. Non sono symbol (i symbol sono stati introdotti recentemente), ma dei metodi "classici". Forniscono un alternativa "old-style" per implementare le conversioni.
111111

112-
Se non è presente `Symbol.toPrimitive` allora JavaScript prova a richiamare questi due metodi nell'ordine:
112+
Se non è presente `Symbol.toPrimitive`, JavaScript prova a richiamare questi due metodi nell'ordine:
113113

114114
- `toString -> valueOf` per hint di tipo "string".
115115
- `valueOf -> toString` altrimenti.
@@ -157,30 +157,58 @@ In assenza di `Symbol.toPrimitive` e `valueOf`, `toString` gestirà tutte le con
157157

158158
## Tipi di ritorno
159159

160-
Una cosa importante da sapere riguardo tutte le conversioni primitive è che non devono necessariamente ritornare il tipo "hint" (suggerito).
160+
Una cosa importante da sapere riguardo le conversioni primitive è che non devono necessariamente ritornare il tipo "hint" (suggerito).
161161

162-
There is no control whether `toString` returns exactly a string, or whether `Symbol.toPrimitive` method returns a number for a hint `"number"`.
162+
Non c'è controllo riguardo al ritorno; ad esempio se `toString` ritorna effettivamente una stringa, o se `Symbol.toPrimitive` ritorna un numero per una *hint* `"number"`
163163

164164
L'unico obbligo: questi metodi devono ritornare un tipo primitivo, non un oggetto.
165165

166166
```smart header="Note storiche"
167-
Per ragioni storiche, se `toString` o `valueOf` ritornasse un oggetto, non ci sarebbero errori, ma sarebbe semplicemente ignorato(come se il metodo non esistesse). Questo accade perché inzialmente in JavaScript non c'era il concetto di "errore".
167+
Per ragioni storiche, se `toString` o `valueOf` ritornassero un oggetto, non ci sarebbero errori, ma il risultato sarebbe ignorato (come se il metodo non esistesse). Questo accade perché inizialmente in JavaScript non c'era il concetto di "errore".
168168
169169
Invece, `Symbol.toPrimitive` *deve* ritornare un tipo primitivo, altrimenti ci sarebbe un errore.
170170
```
171171

172-
## Further conversions
172+
## Ulteriori conversioni
173173

174-
As we know already, many operators and functions perform type conversions, e.g. multiplication `*` converts operands to numbers.
174+
Come già sappiamo, molti operatori eseguono una conversione dei tipi, per esempio l'operatore `*`, che converte gli operandi a numeri.
175175

176-
If we pass an object as an argument, then there are two stages:
177-
1. The object is converted to a primitive (using the rules described above).
178-
2. If the resulting primitive isn't of the right type, it's converted.
176+
Se passiamo un oggetto come argomento, ci sono due passaggi:
177+
1. L'oggetto è convertito a primitivo (secondo le regole spiegate sopra).
178+
2. Se il risultato primitivo non è del tipo giusto, viene convertito.
179179

180180
Ad esempio:
181181

182+
```js run
183+
let obj = {
184+
// toString gestisce tutte le conversioni nel caso manchino gli altri metodi
185+
toString() {
186+
return "2";
187+
}
188+
};
189+
190+
alert(obj * 2); // 4, l'oggetto viene convertito al primitivo "2", successivamente la moltiplicazione lo converte a numero
191+
```
192+
193+
1. La moltiplicazione `obj * 2` prima converte l'oggetto a primitivo (è una stringa, `"2"`).
194+
2. Quindi `"2" * 2` diventa `2 * 2` (la stringa è convertita a numero).
195+
196+
Binary plus will concatenate strings in the same situation, as it gladly accepts a string:
197+
L'operatorio binario `+` concatenerebbe delle stringhe nella stessa situazione:
198+
199+
```js run
200+
let obj = {
201+
toString() {
202+
return "2";
203+
}
204+
};
205+
206+
alert(obj + 2); // 22 ("2" + 2), la conversione a primitivo ha restituito una stringa => concatenazione
207+
```
208+
182209
## Riepilogo
183210

211+
La conversione di un oggetto a primitivo viene automaticamente effettuata da molte funzioni integrate e da operatori che si aspettano un primitivo come valore.
184212
Ce ne sono tre tipi (hint):
185213
- `"string"` (per `alert` e altre conversioni al tipo string)
186214
- `"number"` (per operazioni matematiche)
@@ -197,4 +225,4 @@ L'algoritmo di conversione segue questi passi:
197225
3. Altrimenti se "hint" è di tipo `"number"` o `"default"`
198226
- prova `obj.valueOf()` and `obj.toString()`, sempre se esiste.
199227

200-
Nella pratica, spesso è sufficiente implementare solo `obj.toString()` come metodo che "cattura tutte" le conversioni, e ritorna una rappresentazione dell'oggetto "interpretabile dall'uomo".
228+
Nella pratica, spesso è sufficiente implementare solo `obj.toString()` come metodo che "cattura tutte" le conversioni e ritorna una rappresentazione dell'oggetto "interpretabile dall'uomo", per mostrarlo o per il debugging.

0 commit comments

Comments
 (0)