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/09-object-toprimitive/article.md
+49-21Lines changed: 49 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,26 +1,26 @@
1
1
2
-
# Conversione da oggetto a primitiva
2
+
# Conversione da oggetto a primitivi
3
3
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)`?
5
5
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.
7
7
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.
9
9
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.
11
11
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.
13
13
14
14
## ToPrimitive
15
15
16
16
Possiamo gestire la conversione numerica o a stringa, utilizzando dei metodi speciali dell'oggetto.
17
17
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)).
19
19
20
20
Ci sono tre varianti:
21
21
22
22
`"string"`
23
-
: Unoperazione 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`:
24
24
25
25
```js
26
26
// output
@@ -46,7 +46,7 @@ Ci sono tre varianti:
46
46
```
47
47
48
48
`"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.
50
50
51
51
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.
52
52
@@ -67,7 +67,7 @@ Notate -- ci sono solo tre hint. Semplice. Non esiste alcuna conversione al tipo
67
67
**Per eseguire la conversione JavaScript tenta di chiamare tre metodi dell'oggetto:**
68
68
69
69
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"`
71
71
- prova `obj.toString()` e `obj.valueOf()`, sempre se esistono.
72
72
3. Altrimenti se "hint" è di tipo `"number"` o `"default"`
73
73
- prova `obj.valueOf()` and `obj.toString()`, sempre se esistono.
@@ -102,14 +102,14 @@ alert(+user); // hint: number -> 1000
102
102
alert(user +500); // hint: default -> 1500
103
103
```
104
104
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.
106
106
107
107
108
108
## toString/valueOf
109
109
110
110
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.
111
111
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:
113
113
114
114
-`toString -> valueOf` per hint di tipo "string".
115
115
-`valueOf -> toString` altrimenti.
@@ -157,30 +157,58 @@ In assenza di `Symbol.toPrimitive` e `valueOf`, `toString` gestirà tutte le con
157
157
158
158
## Tipi di ritorno
159
159
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).
161
161
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"`
163
163
164
164
L'unico obbligo: questi metodi devono ritornare un tipo primitivo, non un oggetto.
165
165
166
166
```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".
168
168
169
169
Invece, `Symbol.toPrimitive` *deve* ritornare un tipo primitivo, altrimenti ci sarebbe un errore.
170
170
```
171
171
172
-
## Further conversions
172
+
## Ulteriori conversioni
173
173
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.
175
175
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.
179
179
180
180
Ad esempio:
181
181
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
+
182
209
## Riepilogo
183
210
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.
184
212
Ce ne sono tre tipi (hint):
185
213
-`"string"` (per `alert` e altre conversioni al tipo string)
186
214
-`"number"` (per operazioni matematiche)
@@ -197,4 +225,4 @@ L'algoritmo di conversione segue questi passi:
197
225
3. Altrimenti se "hint" è di tipo `"number"` o `"default"`
198
226
- prova `obj.valueOf()` and `obj.toString()`, sempre se esiste.
199
227
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