Avisar de contenido inadecuado

¿Cómo debemos crear Arrays, Objetos y Funciones en Javascript?

{
}

En Javascript existen lo que se llaman las funciones constructoras. Son funciones que nos permiten crear objetos cuando las llamamos con el operador new.

Todos los "tipos de dato" (arrays, funciones, strings...) en Javascript tienen su funcion constructora correspondiente, aunque para crear estos elementos se recomienda utilizar la llamada 'notación literal'

Pero... ¿por qué no conviene usar las funciones constructoras…

  • new Object()
  • new Array()
  • new Function()
  • new Boolean()
  • new String()
  • new Number()

…para crear objetos, arrays, funciones o datos de tipo booleano, string o number?

Las respuesta nos viene de la mano de Douglas Crockford aquí:
http://www.yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/

JavaScript is a prototypal language, but it has a new operator that tries to make it look sort of like a classical language. That tends to confuse programmers, leading to some problematic programming patterns.

 You never need to use new Object() in JavaScript. Use the object literal {} instead.

 Similarly, don’t use new Array(), use the array literal [] instead. Arrays in JavaScript work nothing like the arrays in Java, and use of the Java-like syntax will confuse you.

 Do not use new Number, new String, or new Boolean. These forms produce unnecessary object wrappers. Just use simple literals instead.
Do not use new Function to create function values. Use function expressions instead.

En general es mas limpio (más claro) crear estos elementos con la notación literal y además:

  • En el caso de new Number, new String y new Boolean lo que creamos son objetos contenedores de estos datos y no el tipo de dato primitivo (ocupa mas memoria innecesaria).

Como los métodos del objeto los podremos usar igual (al llamarlos, JS convertirá el dato en objeto, llamará al método, devolverá el resultado y destruirá el objeto creado) no es necesario crear el objeto de primeras para utilizar sus métodos

  • En el caso de new Function hace un eval del código que le pasamos, perdemos el lexical scope y mas cosas que hacen que no sea una buena manera de crear una función

Es interesante el comentario de Nicholas C. Zakas en este post:

I think it’s also important to answer the question, “if I’m not supposed to do it, then why am I allowed to?”
In the case of String, Number, Boolean, and Function, these constructors are available so that their prototypes can be augmented, not so they can be instantiated.
Since these are used to create wrappers on the fly, it’s the only way to add new methods to this type of data.

Es por esto que la herramienta JSLint (una herramienta muy recomendable para validar el código) no admite el uso de estas funciones constructoras:

Constructors and new

Constructors are functions that are designed to be used with the new prefix. The new prefix creates a new object based on the function's prototype, and binds that object to the function's implied this parameter. If you neglect to use the new prefix, no new object will be made and this will be bound to the global object. This is a serious mistake.
JSLint enforces the convention that constructor functions be given names with initial uppercase. So…

  • JSLint does not expect to see a function invocation with an initial uppercase name unless it has the new prefix.
  • JSLint does not expect to see the new prefix used with functions whose names do not start with initial uppercase. This can be controlled with the newcap option.
  • JSLint does not expect to see the wrapper forms new Number, new String, new Boolean.
  • JSLint does not expect to see new Object (use {} instead).
  • JSLint does not expect to see new Array (use [] instead).

Conclusion:

Para crear Strings, Numbers o Booleans asignamos directamente a nuestra variable el tipo de dato.

Para crear Arrays, Objetos o Funciones utilizaremos la notacion literal

Es decir:

  • Para crear Arrays utilizaremos --> var myArray = [];
  • Para crear Objetos utilizaremos --> var myObject = {};
  • Para crear Funciones utilizaremos --> var myFunction = function () {};
  • Para crear Strings haremos --> var myString = "";
  • Para crear Numbers haremos --> var myNumber = 0;
  • Para crear Booleans haremos --> var myBoolean = false;
{
}
{
}

Comentarios ¿Cómo debemos crear Arrays, Objetos y Funciones en Javascript?

Muy buen aporte. La verdad es que siempre he declarado correctamente las variables, arrays por inercia... pero siempre viene bien una explicación técnica del flujo real de nuestros códigos.
Por cierto, no conocía la herramienta de validación JSLint... creo que sacaré partido de ella.
Saludos

Deja tu comentario ¿Cómo debemos crear Arrays, Objetos y Funciones en Javascript?

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar de usuario Tu nombre