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 toStringmétodo del objeto pasado, por ejemplo:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
Por otro lado, si un identificador se refiere a nullo undefinedno puede usar el toStringmétodo, le dará una TypeErrorexcepción :
var value = null;
String(null); // "null"
value.toString(); // TypeError
El Stringconstructor 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:
toStringmétodo.
resultes una primitiva , regrese result; de lo contrario, vaya al Paso 2.valueOfmétodo.
resultes 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 ToPrimitivey las ToStringoperaciones 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 sivaluees 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 comonulloundefined.''+valueproducirá 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