Javascript tiene muchos "trucos" sobre los tipos y las conversiones de tipo, así que me pregunto si estos 2 métodos son iguales o si hay algún caso de esquina que haga ellos diferentes?Cuál es la diferencia entre String (value) vs value.toString()
Respuesta
Ellos no son del todo la misma, y, de hecho, the String constructor called as a function (el primer ejemplo), será al final, llame al método toString
del objeto pasado, por ejemplo:
var o = { toString: function() { return "foo"; } };
String(o); // "foo"
Por otro lado, Si un identificador hace referencia a null
o undefined
, no se puede utilizar, evidentemente, el método toString
, se le dará un TypeError
excepción:
var value = null;
String(null); // "null"
value.toString(); // TypeError
El constructor String
llamado como una función sería aproximadamente equivalente a:
value+'';
El tipo de Objeto -a-- Primitive están detalladas descritas en la especificación, el funcionamiento interno [[DefaultValue]]
.
En un breve, cuando se convierte de Objeto -a-- cadena, se toman los pasos siguientes:
- Si está disponible, ejecute el método
toString
.- Si el
result
es no una primitiva, vaya al paso 2, de lo contrario devolver elresult
- Si el
- Si está disponible, ejecute el método
valueOf
.- Si el
result
es una primitiva, volverresult
, de lo contrario Paso 3.
- Si el
- Throw
TypeError
.
Dadas las reglas anteriores, podemos hacer un ejemplo de la semántica involucrados:
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!
}
Si desea digg-en más en este mecanismo le recomiendo que para dar un vistazo a la ToPrimitive
y las operaciones internas ToString
.
También te recomendaría este artículo:
value.toString()
causará un error si value
es nulo. String(value)
no debería.
Por ejemplo:
var value = null;
alert(value.toString());
fallará porque value == null
.
var value = null;
alert(String(value));
debe mostrar un mensaje que dice "nulo" (o similar), pero no se bloqueará.
nunca he visto una excepción de puntero nulo en javascript ... ¿de dónde ¿Ves eso? –
¿Quizás quiso decir que el error "' value' is null/undefined "? – casablanca
agradable.sería aún mejor con un ejemplo – mykhal
String(value)
deberían tener el mismo resultado que value.toString()
en todos los casos, excepto para los valores sin propiedades como null
o undefined
. ''+value
producirá el mismo resultado.
String() [la llamada de constructor ] es básicamente llamando a la .toString()
.toString() y String() puede ser llamado en los valores primitivos (número, booleano, string) y básicamente va a hacer nada especial:
cierto => 'verdadera'
falsa => 'falsa'
17 => '17'
'hola' => 'hola'
Pero llamar a estas funciones en los objetos es donde las cosas se pone interesante:
si el objeto tiene su función propia .toString() será llamada cuando cada vez que necesita este objeto a ser tratado como una cadena (de forma explícita/implícita)
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
Por cierto, si usted quiere tratar este objeto como un número que debería tiene una función .valueOf() definido en ella.
¿qué pasa si tenemos ambos en un objeto?
si queremos tratar este objeto como una cadena => utilizar .toString()
si queremos tratar este objeto como un número => utilizar .valueOf()
¿qué ocurre si solo tenemos .valueOf() definido?
.valueOf() definido dentro del objeto se llamará si queremos manejar el objeto como una cadena o como un número
- 1. ¿Cuál es la diferencia entre() vs [] vs {}?
- 2. ¿Cuál es la diferencia entre Double.parseDouble (String) y Double.valueOf (String)?
- 3. ¿Cuál es la diferencia entre jQuery .val() y .attr ('value')?
- 4. Datastore Category vs. String: ¿cuál es la diferencia?
- 5. Cuál es la diferencia entre colorWithSRGBRed vs colorWithDeviceRed vs colorWithCalibratedRed
- 6. ¿Cuál es la diferencia entre string y StringBuilder?
- 7. ¿Cuál es la diferencia entre CharSequence [] y un String []?
- 8. ¿Cuál es la diferencia entre X = X ++; vs X ++ ;?
- 9. ¿Cuál es la diferencia entre Func <string, string> y delegate?
- 10. Diferencia entre @string y @ + string?
- 11. Char.IsDigit() vs Char.IsNumber(), ¿cuál es la diferencia?
- 12. ¿Cuál es la diferencia entre gets.chomp() vs. STDIN.gets.chomp()?
- 13. ¿Cuál es la diferencia entre Cassandra vs Oracle Coherence?
- 14. ¿Cuál es la diferencia entre "git reset" vs "git rebase"?
- 15. ¿Cuál es la diferencia entre Selenium's Remote Control vs WebDriver?
- 16. ¿Cuál es la diferencia entre Console.WriteLine() vs Debug.WriteLine()?
- 17. ¿Cuál es la diferencia entre "origen maestro" vs "origen/maestro"
- 18. ¿Cuál es la diferencia entre html.AttributeEncode vs html.Encode?
- 19. ¿Cuál es la diferencia entre Solr vs Websolr?
- 20. ¿Cuál es la diferencia entre ser db_owner vs. db_datareader/db_datawriter?
- 21. Mysql: ¿Cuál es la diferencia entre "slow_query_log" vs "log_slow_queries"
- 22. ¿Cuál es la diferencia entre process.cwd() vs __dirname?
- 23. ¿cuál es la diferencia entre ResultSetExtractor vs Rowmapper?
- 24. EQU vs DC.B. ¿Cuál es la diferencia?
- 25. JIT vs NGen: ¿cuál es la diferencia?
- 26. CATALINA_OPTS vs JAVA_OPTS - ¿Cuál es la diferencia?
- 27. SET vs. SELECT - ¿Cuál es la diferencia?
- 28. diferencia (String args ...) vs fn (String [] args)
- 29. ¿Cuál es la diferencia entre llamar Double.valueOf (String s) y new Double (String s)?
- 30. ¿Cuál es la diferencia entre Double.valueOf (String s) y Double.ParseDouble (String s)?
Hay una tercera "forma", si llama a esto: 'new String (valor)' en cualquier valor, siempre devolverá un objeto de cadena. – Herbertusz