2009-05-19 12 views
36

En JSLint, se advierte que¿Qué pasa con var x = new Array();

var x = new Array(); 

(Eso no es un nombre de variable real) debe ser

var result = []; 

Qué le pasa a la primera sintaxis? ¿Cuál es el razonamiento detrás de la sugerencia?

+2

No hay nada de malo en la primera sintaxis. El segundo es simplemente más corto. –

Respuesta

26

Crockford doesn't like new. Por lo tanto, JSLint expects you to avoid it cuando sea posible. Y la creación de un nuevo objeto de matriz es posible sin utilizar new ....

+3

Sin embargo, jslint se rompe cuando intenta iniciar una matriz con n valores.Por ejemplo: var x = new Array (20); Este método de creación no se usa a menudo, pero tiene sus casos y es mucho más rápido que usar un bucle para crear y poblar una matriz. –

+3

Puede simplemente establecer el n-ésimo elemento como indefinido y hace más o menos lo mismo – mikelikespie

+7

Sin embargo, no es necesario inicializar una matriz a un cierto tamaño en la declaración. Las matrices de JavaScript no son como las matrices en C. Son objetos, no de tamaño estático, pedazos contiguos de memoria. Debido a esto, puede agregar valores según sea necesario para su matriz. De hecho, podría ser * más lento * para inicializar en la declaración y luego rellenar porque en el momento de la declaración, todas las n claves tienen que ser hash, y luego, como se les asignan valores, es posible que tengan que volver a generar el hash. –

69

Es más seguro utilizar [] de lo que es el uso de new Array(), porque en realidad se puede anular el valor de Array en JavaScript:

Array = function() { }; 

var x = new Array(); 
// x is now an Object instead of an Array. 

En otras palabras, [] es inequívoca.

+0

podría dar un ejemplo? – TStamper

+0

¡Buen punto! Tenga en cuenta que anular Array también generará serios problemas en el código que intenta utilizar métodos Array.prototype en objetos tipo array, como argumentos ... Por lo tanto, sigue siendo una muy mala idea. – Shog9

+2

No solo eso, sino que el constructor Array() tiene un comportamiento "extraño" dependiendo de cuántos argumentos lo pase. En general, es peculiar y es mejor evitarlo. –

2

No hay nada de malo en la primera sintaxis per se. De hecho, en w3schools, enumera new Array() como la forma de crear una matriz. El problema es que esta es la "vieja manera". La "nueva forma", [] es más corta, y le permite inicializar valores en la matriz, como en ["foo", "bar"]. La mayoría de los desarrolladores prefieren [] a new Array() en términos de buen estilo.

+1

¿Por qué se bajó este voto? –

+19

probablemente porque w3 schools no está asociado a w3.org y a menudo tienen un código pobre o inexacto. –

+0

@AndrewAustin Es cierto. Aunque en las redes internas, como regla general, debe verificar las fuentes, sin importar de dónde tomó la información. – Tivie

4

No hay nada malo con cualquiera de las formas, pero normalmente se ve literales utilizados siempre que sea posible-

var s = '' no es más correcta que var s = new String() ....

7

Parece que puede obtener un rendimiento diferente según el navegador y el entorno:

http://jsperf.com/new-array-vs-literal/11 ([1, .2] vs new Array (1, .2)) el literal es el camino más rápido en esta circunstancia.

http://jsperf.com/new-array-vs-literal/7 (nuevo Array (500000) vs [] .length (500000)) nuevo Array es más rápido en chrome v21 que parece para esta prueba en aproximadamente 7% o 30%) dependiendo de lo que haga.

+4

+1 para la ciencia! –

+1

+1 porque los puntos de referencia generalmente ayudan a poner las cosas en perspectiva – Tivie

Cuestiones relacionadas