2010-11-01 13 views

Respuesta

7

incorporado envoltorios de objetos (creados con las Boolean, Number, String y Date constuctors) almacenar la primitiva valor envuelto en una propiedad interna llamada [[PrimitiveValue]], que no puede ser cambiado, pero ...

Usted puede anular el método valueOf de su objeto test:

var test = new Boolean(0); 
test.prop = "OK!" 
// override valueOf: 
test.valueOf = function() { return true; }; 

if (test == true) { // using the equals operator explicitly for type conversion 
    alert(test.prop); //"OK!" 
} 

Funcionará ya que el método valueOf se usa internamente por los mecanismos de conversión de tipo activados por el operador igual.

Cuando uno de los operandos es un valor booleano, ambos se convierten al final en Número.

Si no utilizamos el operador equals (por ejemplo if (test) { ... }), ya que test es un objeto, cuando se convierte directamente a Boolean, será siempre producen true.

Cualquier objeto convertida a Boolean producirá el valor true, los únicos valores que puede producir un resultado false, son los valores "Falsey" (null, undefined, 0, NaN, una cadena vacía, y por supuesto el valor false), cualquier otra cosa producirá true.

Más información:

+0

aunque la representación de cadena se mantiene a 'false', ya que el valor subyacente no ha cambiado realmente .. –

+2

@Gaby, bueno, depende de cómo se hace la conversión de tipos, por ejemplo, si usted concatena una cadena, por ejemplo 'test + ''' el resultado seguirá siendo ''true'' (' valueOf' se usará primero), si usa el constructor' String' como una función, p. ej .: 'String (test);' llamará al ['Boolean.prototype.toString'] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2) método. Estoy de acuerdo, es una buena idea anular 'toString' también. – CMS

+0

ah muy bien ... acabo de alertar el valor 'alerta (prueba)' y mostró 'falso'. Parece que el método 'alert' utiliza el constructor String o llama' toString' a sus argumentos ... gracias por el aviso. –

1

var test = new Boolean(0); 

crea un nuevo objeto y pone una referencia a él en la 'prueba'

test.prop = 'ss' 

pone dinámicamente una nueva propiedad en el objeto (meta-programación FTW!)

test = true; 

asigna la prueba a un tipo primitivo booleano. La referencia al objeto booleano se pierde.

Finalmente, el objeto booleano no parece tener ningún método para alternar o reasignar su valor, es decir, los objetos booleanos son inmutables.

Sin embargo, se podría añadir un método para cambiar Boolean.prototype que si se quería ....

0

Las envolturas objeto crear un tipo de referencia inmutable en JS. Como en JS los tipos de datos primitivos son inmutables, sus referencias también deben ser inmutables.Puede ser útil para algunos casos excepcionales, pero es probable que no haga lo que desea. Por ejemplo, si necesita modificar el valor primitivo de origen y observar las referencias para seguirlo, no puede usar el constructor de Objetos para lograr el efecto deseado. Entonces su mejor opción sería evitar el constructor Object y usar un literal de objeto adecuado para albergar su valor primitivo bajo una propiedad de la siguiente manera;

var pv = "test", 
 
    pvr = {0: pv}, 
 
    arr = new Array(5).fill().map(_ => pvr); 
 
console.log(JSON.stringify(arr)); 
 
pvr[0] = "Hello"; 
 
console.log(JSON.stringify(arr));

Cuestiones relacionadas