touppercase - ¿Cómo es que una cadena de Javascript no es un objeto?
touppercase para que sirve (1)
"Todo es un objeto" ... ese es uno de los grandes errores que existen en todo el lenguaje.
No todo es un objeto, hay lo que llamamos valores primitivos , que son cadena, número, booleano, nulo e indefinido.
Es cierto, una cadena es un valor primitivo , pero puede acceder a todos los métodos heredados de String.prototype
como si se tratara de un objeto.
Los operadores del acceso a la propiedad (el punto y la notación de corchetes) convierten temporalmente el valor de la cadena en un objeto String, para poder acceder a esos métodos, por ejemplo:
"ab".charAt(1); // "b"
Lo que sucede detrás de escena es algo como esto:
new String("ab").charAt(1); // "b", temporal conversion ToObject
Al igual que con los otros valores primitivos, como Boolean
y Number
, existen contenedores de objetos , que son simplemente objetos que contienen el valor primitivo, como en su ejemplo:
var strObj = new String("");
strObj.prop = "foo";
typeof strObj; // "object"
typeof strObj.prop; // "string"
Mientras que con un primitivo:
var strValue = "";
strValue.prop = "foo";
typeof strValue; // "string"
typeof strValue.prop; // "undefined"
Y esto sucede porque, una vez más, el acceso a la propiedad en la segunda línea de arriba, crea un nuevo objeto temporal, como:
var strValue = "";
new String(strValue).prop = "foo"; // a new object which is discarded
//...
No es la configuración para una broma, realmente estoy preguntando.
A Douglas Crockford le gusta decir que en el lenguaje orientado a objetos prototípico de javascript no hay necesidad de new
.
Él explica que simplemente se agregó algo nuevo para dar a las personas que provienen de los lenguajes de programación orientados a objetos basados en clases (es decir, " clásicos ") algún nivel de comodidad:
JavaScript, Nosotros apenas
new
YaJavaScript es un lenguaje de prototipos, pero tiene un
new
operador que intenta hacer que se vea como un lenguaje clásico. Eso tiende a confundir a los programadores, lo que lleva a algunos patrones de programación problemáticos.Nunca necesita usar el
new Object()
en JavaScript. Use el objeto literal{}
lugar.
Bien vale:
-
new
mal -
{}
bueno
Pero el comentarista Vítor De Araújo señaló que los dos no son lo mismo . Él da un ejemplo que muestra que una string
no es como un object
:
Un objeto de cadena y un valor de cadena no son lo mismo:
js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42
El valor de cadena no puede tener nuevas propiedades. Lo mismo es válido para otros tipos.
¿Qué está pasando aquí que una string
no es un object
? ¿Estoy confundiendo javascript con algunos otros idiomas, donde todo es un objeto?