Javascript tiene muchos "trucos" en torno a los tipos y conversiones de tipos, así que me pregunto si estos 2 métodos son iguales o si hay algún caso de esquina que los haga diferentes.
fuente
Javascript tiene muchos "trucos" en torno a los tipos y conversiones de tipos, así que me pregunto si estos 2 métodos son iguales o si hay algún caso de esquina que los haga diferentes.
No son completamente iguales y, de hecho, el constructor String llamado como función (su primer ejemplo), al final, llamará al toString
método del objeto pasado, por ejemplo:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
Por otro lado, si un identificador se refiere a null
o undefined
no puede usar el toString
método, le dará una TypeError
excepción :
var value = null;
String(null); // "null"
value.toString(); // TypeError
El String
constructor llamado como función sería aproximadamente equivalente a:
value + '';
Las reglas de conversión de tipo de objeto -a-- Primitive están detalladas descritas en la especificación, el [[DefaultValue]]
funcionamiento interno.
Resumiendo brevemente, al convertir de Object -a-- cadena , se toman los pasos siguientes:
toString
método.
result
es una primitiva , regrese result
; de lo contrario, vaya al Paso 2.valueOf
método.
result
es una primitiva , regrese result
; de lo contrario, vaya al Paso 3.TypeError
.Dadas las reglas anteriores, podemos hacer un ejemplo de la semántica involucrada:
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
Si desea saber más acerca de este mecanismo Yo recomiendo mirar el ToPrimitive
y las ToString
operaciones internas.
También recomiendo leer este artículo:
new String(value)
en cualquier valor, siempre devolverá un objeto de cadena.new String({toString: null})
lanza unTypeError
.String()
y+ ''
ahora tienen una diferencia bastante significativa.String(Symbol())
se ejecutará, peroSymbol() + ''
arrojará un error (y Symbol () pasará una guardia falsa, a diferencia de null e undefined, porx && (x + '')
lo que ahora puede lanzar).value.toString()
causará un error sivalue
es nulo.String(value)
no debería.Por ejemplo:
fallará porque
value == null
.debería mostrar un mensaje que diga "nulo" (o similar), pero no fallará.
fuente
String(value)
debería tener el mismo resultado quevalue.toString()
en todos los casos, excepto para valores sin propiedades comonull
oundefined
.''+value
producirá el mismo resultado.fuente
String () [la llamada al constructor ] básicamente está llamando al .toString ()
.toString () y String () se pueden llamar en valores primitivos (número, booleano, cadena) y básicamente no harán nada especial:
Pero llamar a estas funciones en objetos es donde las cosas se ponen interesantes:
si el objeto tiene su propia función .toString (), será llamado siempre que necesite que este objeto sea tratado como una cadena (explícitamente / implícitamente)
Por cierto, si desea tratar este objeto como un número, debe tener una función .valueOf () definida en él.
¿qué pasa 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
fuente