2012-07-16 11 views
172

Cuando necesito para declarar una nueva matriz que utilizo esta notación¿Cuáles son las mejores prácticas a seguir cuando se declara una matriz en Javascript?

var arr = new Array(); 

Pero cuando se prueba en línea, por ejemplo, en jsbin, unas señales de advertencia que "utilizar la notación de matriz literal []."

No encontré una razón para evitar el uso del constructor. ¿Es de alguna manera menos eficiente que usar []? ¿O es una mala práctica?

¿Hay una buena razón para usar var arr = []; en lugar de var arr = new Array();?

+5

Ambos están bien. Usted acaba de guardar algunos bytes en la transmisión. – Sirko

+13

De hecho, hay diferencias. Ver esta publicación: http://stackoverflow.com/q/2280285/921204 – techfoobar

+0

Nota: existen diferencias * si se sobrescribió * la matriz. – crdx

Respuesta

257

Parcialmente, la gente utiliza var a = [] porque Douglas Crockford says so.

Sus razones incluyen el comportamiento no intuitivo e inconsistente de new Array():

var a = new Array(5);  // an array pre-sized to 5 elements long 
var b = new Array(5, 10); // an array with two elements in it 

Tenga en cuenta que no hay manera de new Array() para crear una matriz con sólo uno el elemento número especificado previamente en ella!

El uso de [] es en realidad más eficiente, and safer too! Es posible sobrescribir el constructor Array y hacer que haga cosas extrañas, pero no puede sobreescribir el comportamiento de [].

En lo personal, yo siempre uso la sintaxis [], y de manera similar siempre uso {} sintaxis en lugar de new Object().

+5

"no puede sobrescribir el comportamiento de []". ¿Estas seguro acerca de esto? Pensé que podría sobrescribir el constructor de Array para afectar a [], y el constructor de Objetos para afectar {}, al menos en algunas implementaciones. – Random832

+11

@ Random832 quizás en navegadores más antiguos, pero no en implementaciones compatibles con ES5, donde la especificación dice que '[]' llama a un constructor interno, no a cualquier valor que 'Array.constructor' tenga en ese momento. – Alnitak

+5

** Bonificación: ** Los literales de matriz son mucho más rápidos que crear matrices nuevas usando el constructor 'Array': http://jsperf.com/new-array –

4

Hay un límite que el constructor puede tomar como argumentos.

En la mayoría de los sistemas de I encoutered el límite es de 2^16 (2 bytes):

var myFreshArr = new Array(0,1,2,3 ..... 65536); 

que causará un error (demasiados argumentos ....)

Cuando se utiliza el literal [ ] no tienes tales problemas.

En caso de que no se preocupe por matrices tan grandes, creo que puede usar lo que prefiera.

+2

¿Puedes citar un ejemplo de dónde una persona puede razonablemente querer crear una matriz pre-poblada con 70,000 valores? Sin embargo, realmente explica algunos de los terribles sitios web que he visto que parecen no terminar de cargar ... –

+0

@JohnO: la geolocalización de código postal es el único caso en el que puedo pensar. –

+2

John O, he visto algunas implementaciones de SCARY JSON en mi época, que involucran matrices de matrices 2D/3D, con códigos IATA (aeropuerto), compañías aéreas, tour operadores, resorts, etcétera ... ... todo metido en una matriz. Es ... ... descargas de 1MB + JSON que me dan ganas de llorar. – Norguard

3

Es porque new Array() es ambiguo. Estos son los constructores correctas:

// Using brackets 
[element0, element1, ..., elementN] 

// Using new AND a list of elements 
new Array(element0, element1, ..., elementN) 

// Using new AND an integer specifying the array length 
new Array(arrayLength) 
12

No, en realidad no hay razón para usar una notación sobre el otro para matrices vacías.

Sin embargo, la mayoría de los navegadores muestran un rendimiento ligeramente mejor usando x = []; que llamando al Constructor.

Si necesita crear una matriz con un tamaño específico, tipo de necesidad de utilizar x = new Array(10); por ejemplo, lo que crearía una matriz con 10 undefined ranuras.

+3

o 'x = []; x.length = 10' – Alnitak

+0

@Alnitak: que ya mencionaste, no es muy intuitivo y conciso. – jAndy

+7

Armado un jsperf para comparar el rendimiento: http://jsperf.com/array-constructor-versus-literal. Al menos para mí en Chrome 20 en Ubuntu, el literal es dos veces más rápido que el constructor. –

6

Ambos son correctos solamente.Pero la mayoría de la gente usa var a = []

Tres formas de declarar una matriz en JavaScript.

método 1: Podemos declarar explícitamente una matriz con la palabra clave "nueva" de JavaScript para crear una instancia de la matriz en la memoria (es decir, crearla y ponerla a disposición).

// Declare an array (using the array constructor) 
var arlene1 = new Array(); 
var arlene2 = new Array("First element", "Second", "Last"); 

método 2: utilizamos un método alternativo para declarar arrays.

// Declare an array (using literal notation) 
var arlene1 = []; 
var arlene2 = ["First element", "Second", "Last"]; 

método 3: JavaScript también permite crear matrices de forma indirecta, mediante llamadas a métodos específicos.

// Create an array from a method's return value 
var carter = "I-learn-JavaScript"; 
var arlene3 = carter.split("-"); 
6
  • var arr = [] utiliza la matriz/objeto literal
  • var arr = new Array() utilizar el constructor array/object

La forma más rápida para definir una matriz o es objeto de manera literal, ya que no es necesario llamar al constructor

var arr1 = new Array(1, 2, 3, 4); 
var arr2 = [1, 2, 3, 4]; 

alert(arr1[0]); // 1 
alert(arr2[0]); // 1 

var arr3 = new Array(200); 
var arr4 = [200]; 

alert(arr3[0]); // 'undefined' 
alert(arr4[0]); // 200 
+2

Como referencia, detrás de escena, 'var arr = [];' usa lógicamente un constructor también.Es solo * siempre * el constructor de matriz incorporado, en lugar de cualquier función que actualmente tenga el nombre 'Array'. – cHao

4
var array = [ 1, 2, 3, 4]; 

es el azúcar

var array = new Array(1, 2, 3, 4); 

es la sal

+5

y dónde usarlo, para café o pasta? – Aristos

+0

azúcar y sal sintácticos – linquize

48

Una diferencia significativa es que se [] siempre una instancia de una nueva matriz, mientras que new Array podría ser hijacked to create a different object.

(function() { 
    "use strict"; 
    var foo, 
     bar; 
    //don't do this, it's a bad idea 
    function Array() { 
     alert('foo'); 
    } 
    foo = new Array(); 
    bar = []; 
}());​ 

En mi código de ejemplo, he mantenido la función Array escondido del resto del alcance del documento, sin embargo, es más probable que si alguna vez se encuentra con este tipo de problema de que el código no han sido dejó en un buen cierre, y probablemente será difícil de localizar.

Negación: No es una buena idea para secuestrar el constructor Array.

+7

IIRC, en los navegadores más antiguos que reemplazan al constructor Array también causarían que los literales se interpreten incorrectamente. Hubo un GMail CSRF [vulnerabilidad] (http://jeremiahgrossman.blogspot.com.br/2006/01/advanced-web-attack-techniques-using.html) Hace un tiempo, el involucrado reemplazando el constructor de la matriz y los nuevos navegadores ignoran sobrecarga de literales por esta razón precisa. – hugomg

+0

Descargo de responsabilidad: sin embargo, ha sido extremadamente útil y útil para mejorar el constructor Array a lo largo de los años. –

26

para el mantenimiento, utilice []

La matriz literal es más predecible, como la mayoría de los desarrolladores lo usan. La mayor parte del uso de la matriz utilizará el literal, y tiene un valor para que su código coincida con lo que otros desarrolladores usan.

para las matrices vacías, utilice []

var ns = []; 
var names = [ 'john', 'brian' ]; 

Como se muestra here, utilizando el literal de vacío y un par de elementos conocidos es fatster que el constructor Array.

para una matriz de tamaño conocido, utilice new Array(size)

Si se conoce el tamaño, a continuación, utilizando el constructor Array mejora significativamente el rendimiento. Sin embargo, también significa que tiene que tratar con una matriz que ya tiene 'indefinido' llenando todos sus valores.

Como se muestra here

// fill an array with 100 numbers 
var ns = new Array(100); 
for (var i = 0; i < 100; i++) { 
    ns[i] = i; 
} 

Esto también funciona para very small arrays too.

Cuestiones relacionadas