Esto es debido a una peculiaridad (o restricción de rendimiento) en JavaScript - los primitivos tipos string
, boolean
y number
son inmutables y cualquier asignación de propiedad será simplemente "desaparecer" (los tipos primitivos de un solo habitante undefined
y null
arrojarán una excepción en la asignación de propiedades intentada). Esto se debe a que estos valores primitivos son no objetos reales (los hace mucho más livianos durante el tiempo de ejecución).
Sin embargo, para cada uno de los tipos primitivos hay un tipo envoltura: String
, Boolean
, y Number
, respectivamente. Los tipos de envoltura son objetos reales y pueden tener propiedades personalizadas asignadas.
Mientras yo no haría esto, esto va a funcionar (suena como un "diseño repulsivo"):
var s = new String("foo");
s.bar = "hello"
alert(s.bar)
Sin embargo, hay una serie de rarezas que esto introduce - typeof ""
es "cadena" mientras typeof s
es "objeto" *, y "" instanceof String
es falso, mientras que s instanceof String
es verdadero. Además, new Boolean(false)
es un valor de verdad.
Happy coding.
* Esto romperá una serie de biblioteca de Noddy que hacer typeof x === "string"
otro gotcha: '[new String ('a')]. IndexOf ('a') === -1' – OrangeDog