Javascript ha molti "trucchi" intorno a tipi e conversioni di tipi quindi mi chiedo se questi 2 metodi sono uguali o se c'è qualche caso angolare che rende loro diversi?Qual è la differenza tra String (valore) vs value.toString()
risposta
Essi non sono completamente lo stesso, e in realtà, the String constructor called as a function (il vostro primo esempio), sarà alla fine, chiamare il metodo toString
dell'oggetto passato, ad esempio:
var o = { toString: function() { return "foo"; } };
String(o); // "foo"
D'altra parte, se un identificatore si riferisce a null
o undefined
, non è possibile utilizzare, ovviamente, il metodo toString
, che vi darà un'eccezione TypeError
:
var value = null;
String(null); // "null"
value.toString(); // TypeError
Il String
costruttore chiamato come una funzione sarebbe meno equivalente a:
value+'';
Il tipo di oggetto -a-- Primitive sono dettagliate descritte nella specifica, il [[DefaultValue]]
funzionamento interno.
In breve, la conversione da Object -a-- String, vengono adottate le seguenti fasi:
- Se disponibile, eseguire il metodo
toString
.- Se il
result
è non un primitivo, passare al punto 2, altrimenti restituire ilresult
- Se il
- Se disponibile, eseguire il metodo
valueOf
.- Se il
result
è un primitivo, tornareresult
, altro passo 3.
- Se il
- tiro
TypeError
.
Date le regole di cui sopra, possiamo fare un esempio della semantica coinvolte:
var o = {
toString:function() { return "foo"; },
valueOf: function() { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Now make the valueOf method also unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError!
}
Se si vuole digg-in più in questo meccanismo ti consiglierei di dare uno sguardo al ToPrimitive
e le operazioni interne ToString
.
Anche io consiglierei di questo articolo:
value.toString()
causerà un errore se value
è nullo. String(value)
non dovrebbe.
Ad esempio:
var value = null;
alert(value.toString());
non riuscirà perché value == null
.
var value = null;
alert(String(value));
dovrebbe visualizzare un messaggio di lettura "null" (o simile), ma non si arresta in modo anomalo.
Non ho mai visto un'eccezione di puntatore nullo in javascript ... dove sono finiti lo vedi? –
Forse intendevi un errore "valore zero è undefined"? – casablanca
bello.sarebbe ancora più bello con un esempio – mykhal
String(value)
dovrebbero avere lo stesso risultato value.toString()
in tutti i casi, eccetto per valori senza immobili come null
o undefined
. ''+value
produrrà lo stesso risultato.
String() [la chiamata costruttore] è fondamentalmente chiamando il .toString()
.toString() e String() può essere chiamato su valori primitivi (numero, booleano, stringa) e fondamentalmente non farà nulla di speciale:
vero => 'true'
falsa => 'false'
17 => '17'
'ciao' => 'ciao'
Ma chiamando queste funzioni su oggetti è dove le cose si fa interessante:
se l'oggetto ha la sua propria funzione .toString() verrà chiamato quando mai avete bisogno di questo oggetto di essere trattato come una stringa (in modo esplicito/implicito)
let obj = {
myName:"some object",
toString:function(){ return this.myName; }
}
//implicitly treating this obj as a string
"hello " + obj; //"hello some object"
//OR (explicitly)
"hello " + String(obj) //calling the existent toString function
//OR
"hello " + obj.toString(); //calling toString directly
Tra l'altro, se si vuole trattare questo oggetto come un numero si deve ha un .valueOf() funzione definita in esso.
cosa succede se abbiamo entrambi in un oggetto?
se vogliamo trattare questo oggetto come una stringa => utilizzare .toString()
se vogliamo trattare questo oggetto come un numero => utilizzare .valueOf()
cosa succede se abbiamo solo .valueOf() definito?
.valueOf() definita all'interno dell'oggetto verrà chiamato se vogliamo gestire l'oggetto come una stringa o come numero
- 1. Qual è la differenza tra Double.parseDouble (String) e Double.valueOf (String)?
- 2. Qual è la differenza tra string :: at e string :: operator []?
- 3. differenza tra il valore (stringa) e value.toString(), nuova lunga (valore) e del valore (Long)
- 4. Qual è la differenza tra colorWithSRGBRed vs colorWithDeviceRed vs colorWithCalibratedRed
- 5. Qual è la differenza tra process.cwd() vs process.env.PWD?
- 6. Qual è la differenza tra string e StringBuilder?
- 7. Qual è la differenza tra (string [] args) e System.Environment.CommandLine?
- 8. In Ruby, qual è la differenza tra String() e #to_s
- 9. qual è la differenza tra angular.isUndefined (valore) e not! (Valore)?
- 10. Qual è la differenza tra (tipo) valore e tipo (valore)?
- 11. Database vs tablespace, qual è la differenza?
- 12. Shim vs. Sham: Qual è la differenza?
- 13. EQU vs DC.B. Qual è la differenza?
- 14. Permetti vs Stub, qual è la differenza?
- 15. Qual è la differenza tra Cassandra vs Oracle Coherence?
- 16. qual è la vera differenza tra lemmatization vs stemming
- 17. Qual è la differenza tra npm 3 vs Bower?
- 18. underscorejs: qual è la differenza tra extendOwn vs extend?
- 19. qual è la differenza tra ResultSetExtractor vs Rowmapper?
- 20. Qual è la differenza tra process.cwd() vs __dirname?
- 21. Qual è la differenza tra `while (true)` vs `while (\ true)`?
- 22. In MsBuild, qual è la differenza tra CreateProperty vs PropertyGroup?
- 23. Qual è la differenza tra Template.Instance() vs template.data?
- 24. Qual è la differenza tra Function Pointer vs Function Call?
- 25. Qual è la differenza tra essere db_owner vs db_datareader/db_datawriter?
- 26. Qual è la differenza tra FreeGLUT vs GLFW?
- 27. Qual è la differenza tra Console.WriteLine() vs Debug.WriteLine()?
- 28. Qual è la differenza tra * .d.ts vs * .ts in dattiloscritto?
- 29. Qual è la differenza tra NSDictionary vs Dictionary in Swift?
- 30. Qual è la differenza tra jQuery .val() e .attr ('valore')?
C'è un terzo "modo", se si chiama questo: 'nuova stringa (valore)' su qualsiasi valore, verrà sempre restituito un oggetto stringa. – Herbertusz