Javascript asignando valor a primitivo

Si JavaScript coaccionará fácilmente entre los primitivos y los objetos, ¿por qué agregarle propiedades no se define?

var a = "abc"; var b = a.length console.log(b)//outputs 3 

¿La coacción me permite asignar valores a los primitivos? Si no, ¿por qué?

¿La coacción me permite asignar valores a los primitivos?

Sí. La primitiva está envuelta en un objeto, y se crea una propiedad sobre eso. No se lanzará ninguna excepción.

¿Por qué agregar propiedades a esto resulta indefinido?

La adición en sí resulta en el valor.

 var str = "abc"; console.log(str.someProperty = 5); // 5 

Sin embargo, lo que estás pidiendo es obtener una propiedad de un primitivo. Esto se devolverá en undefined ya que la primitiva está envuelta en un nuevo objeto de envoltura, no en el que asignó la propiedad:

 console.log(str.someProperty); // undefined 

Solo funciona para propiedades especiales como .length que se crean con el objeto, o heredadas como los métodos slice o charAt (ver la documentación para esos).

Si quisieras tal cosa, necesitarías crear el objeto envoltorio explícitamente y almacenarlo en algún lugar:

 var strObj = new String("abc"); strObj.someProperty = 5; console.log(strObj.someProperty); // 5 // coercion and the `toString` method will even make the object act like a string console.log(strObj + "def"); // "abcdef" 

¿Por qué no lo haces así?

 var abc=Number(3); abc.foo="bar"; abc; //3 abc.foo; //bar 

@Bergi de hecho, lo siento por esto. Me he perdido la new statement. Aquí está:

 var abc=new Number(3); abc.foo="bar"; abc; //3 abc.foo; //bar 

Al menos funciona bien. No sé qué más puede necesitar alguien 🙂 primitivos … coacción … bla.