2010-11-27 10 views
15

Muchas personas dicen que debe evitar el nuevo objeto, la nueva matriz() y en su lugar usar {}. [], y verdadero/falso.¿Por qué usar {} en lugar de nuevo Object() y usar [] en lugar de new Array() y verdadero/falso en lugar de new Boolean()?

¿Cuáles son los beneficios de utilizar las construcciones literales para obtener una nueva instancia de un objeto o matriz en lugar de utilizar una nueva? Me imagino que a Crockford no le gusta lo nuevo, ¿pero ese es el argumento principal?

+3

'nueva booleano (verdadero)' no es equivalente a 'true' –

+0

Editado con esta corrección. –

Respuesta

8

Las ventajas de objeto y matriz literales sobre el uso de los respectivos constructores son:

  • más corto y más legible
  • más seguro: literales todavía funcionarán cuando los Array o Object constructores se han anulado
  • Posiblemente más rápido, aunque es poco probable que sea una consideración importante (cualquier cuello de botella se originará casi con certeza en otro lugar del código)

En el caso de las matrices, hay una ventaja adicional de un literal: es imposible crear una matriz con un único miembro utilizando el constructor Array solo. Por ejemplo, [3] creará una matriz con un elemento que es el número 3, mientras que new Array(3) crea una matriz de longitud 3.

Actualización: el siguiente párrafo ya no es relevante ahora la cuestión ha sido editado.

En cuanto a los booleanos, parece que tiene una idea falsa: new Boolean(false) no es lo mismo que false. El constructor Boolean() crea un objeto booleano, mientras que false y true son primitivas booleanas. De hecho, new Boolean(false) se evalúa como true cuando se fuerza en un booleano en, por ejemplo, una instrucción if.En resumen, rara vez hay una razón para usar el constructor Boolean(). Use true y false en su lugar. De forma similar, otras primitivas como cadenas y números tienen los constructores correspondientes String() y Number() que producen los objetos String y Number que son diferentes a las cadenas primitivas y los números, y generalmente se deben evitar.

+0

Se editan las preguntas originales para eliminar el verdadero verdadero/falso en lugar de la nueva declaración booleana(). –

+2

@Paul: Dejaré las cosas booleanas en mi respuesta: todavía es información útil. –

+0

sí absolutamente! ¡Gracias! –

4

Por ejemplo, si usted quiere hacer esto:

{name:"bla",address:"address"} 

el camino new Object() sería:

var o = new Object(); 
o.name="bla"; 
o.address="address"; 

El primero de ellos es mucho más corto. Y creo que también sería más rápido en muchos navegadores (jsperf testcase).

+0

Más rápido, sí. Hace varios años probé el 'nuevo método Array()' luego agregué todos los valores con 'arr.push()' - había miles de valores para agregar (no tenía vida = _ =) y fue lento como ... . Dulce de azúcar. Simplemente colocando todos los valores en el constructor de la matriz 'new Array (val1, val2, val3 ...)' ¡fue mucho más rápido! –

+1

@Kolink - Eso es probable porque llamabas '.push()'. La pregunta aquí es más sobre el constructor 'new Array (val1, val2, val3 ...)' vs literal '[val1, val2, val3 ...]' – user113716

+0

'new Object()' y 'new Array()' son mucho más rápido cuando necesita construir una tonelada de ellos y luego configurar/anexar datos muy a menudo. En un analizador sintáctico/decodificador hay una ganancia de velocidad notable al usarlos. –

3

Creo que se trata principalmente de sucinctness.

¿Por qué escribir new Array() cuando se puede escribir [], o new Object() cuando se puede escribir {}?

También new Boolean() es completamente redundante. Un booleano siempre tendrá que ser verdadero o falso, por lo que definitivamente debe usar las constantes integradas para eso.

+0

'new Boolean (true)' es peor que redundante, es diferente al primitivo 'true'. Ver mi respuesta –

1

En la mayoría de los casos, un object literal o matriz literal es suficiente y más fácil de usar. Incluso puede llamar o aplicar métodos prototipo (por ejemplo, [] .prototype.slice.call (someObj)). También es mayormente faster. Es posible que desee darse cuenta de que el constructor {} y [] no se puede sobrescribir y que Object y Array son constructores donde {} y [] son ​​instancias.

+0

He ejecutado la prueba jsperf a la que enlazas y los literales son los más lentos de los tres (_en mi máquina_). Supongo que se debe a Firefox 3.6.12 –

+0

Ejecuté las pruebas en Chrome, donde el uso de literales fue más rápido. Si se desplaza hacia abajo en la página jsperf hay algunos resultados adicionales de 'browserscope' – KooiInc

0

Una razón aún no mencionada es la ambigüedad al pasar parámetros al constructor Array. Es todo comportamiento especificado, es simplemente peculiar.

new Array(1,2,3); // [1,2,3], that's OK 
new Array(1); // [undefined], some may expect to get [1] instead 

matriz A JavaScript se inicializa con los elementos dados, excepto en el caso en que un argumento único se pasa al constructor Array y que argumento es un número. (Consulte a continuación.) Tenga en cuenta que este caso especial solo se aplica a las matrices JavaScript creadas con el constructor Array, no a los literales creados con la sintaxis del paréntesis. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Syntax

Cuestiones relacionadas