Esta pregunta ha salido de another, que se refiere al comportamiento de console.dir
con literales de cadena. En particular, vea los comentarios en my answer.¿Por qué los métodos de String.prototype están disponibles para los literales de cadena?
Como todos sabemos, String
objetos en JavaScript tiene una serie de métodos. Esos métodos están definidos en el objeto String.prototype
. String.prototype.toUpperCase
por ejemplo. Por tanto, podemos hacer cosas como esta:
var s = new String("hello"),
s2 = s.toUpperCase(); //toUpperCase is a method on String.prototype
Sin embargo, también podemos hacer esto:
var s = "hello", //s is a string literal, not an instance of String
s2 = s.toUpperCase();
Claramente, el intérprete de JavaScript está haciendo algún tipo de conversión A/fundido cuando se llama a un método de String.prototype
en una cadena literal. Sin embargo, no puedo encontrar ninguna referencia a esto en el spec.
Tiene sentido, porque de lo contrario tendrías que copiar explícitamente cada cadena literal a un objeto String
antes de que pudieras usar cualquiera de los métodos, y eso sería bastante molesto.
Así que mi pregunta es, ¿dónde se describe esta funcionalidad, y estoy en lo cierto al suponer que el valor literal se transfiere temporalmente a una instancia de String
? ¿Estoy pensando demasiado y me estoy perdiendo algo obvio?
Por cierto, la notación 'new String (value)' es 100% inútil ... no lo use. –
Sé que es. La pregunta es por qué. ¿Dónde se describe esto en la especificación? –
Un literal de cadena es un objeto de cadena: 'typeof" hello "===" string "' devuelve true. ¿Eso llega al problema? – bbg