2011-04-29 18 views
31

Acabo de empezar a pensar en esto, pero no pude encontrar ninguna diferencia para exponerse a sí mismos mientras husmeaba en jsFiddle.¿Cuál es la diferencia entre Array (1) y el nuevo Array (1) en JavaScript?

var a = new Array(1), 
    b = Array(1); 

console.log(a, b); 

La salida es de dos matrices con un miembro indefinido.

Haciendo un for (in) revela que tienen las mismas propiedades.

¿Cuáles son las diferencias entre estos? ¿El primero simplemente crea una instancia del objeto explícitamente?

Por favor, no me hable sobre el uso de la notación literal de matriz, como ya sé sobre eso. Estoy más deseoso de llenar este vacío en mi conocimiento explicado anteriormente.

+1

[nueva palabra clave en JS] (http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript) –

+0

Voy a tomar una puñalada salvaje y decir que nuevo significa que es un objeto como el que no tiene nuevo no lo es. El que tenga uno nuevo tendrá los métodos que se describen aquí http://www.w3schools.com/jsref/jsref_obj_array.asp, mientras que el que no tiene nuevo no lo hará. – Flipper

+0

@Flipper Repasé las propiedades de cada uno y ambos parecen tener los mismos métodos. – alex

Respuesta

31

Con Array, ambos son equivalentes. El new se inyecta cuando se llama como una función:

15.4.1 El Constructor Array llamar como función

Cuando Array se llama como una función más que como un constructor, se crea y se inicializa un nuevo objeto Array. Por lo tanto, la llamada de función Array(…) es equivalente a la expresión de creación de objeto new Array(…) con los mismos argumentos.

De ECMA-262, 3th Edition (con similar en 5th Edition).

4

La diferencia radica en la implementación de la función Array. Si una llamada a Array sin un nuevo operador devolverá una instancia de Array o no dependerá de la implementación. Por ejemplo SpiderMonkey motor de Mozilla hace esto:

static JSBool 
Array(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) 
{ 
    jsuint length; 
    jsval *vector; 

    /* If called without new, replace obj with a new Array object. */ 

Eso es un comentario real de la fuente real. Las siguientes líneas de código no se reproducen aquí. Supongo que otros motores hacen lo mismo. De lo contrario, el comportamiento no está definido. Una buena lectura sobre este tema es la publicación de John Resig here.

5

De acuerdo con Javascript: La guía definitiva (5ª edición), página 602, "Cuando el constructor Array() se llama como una función, sin que el operador new, se comporta exactamente igual que cuando se le llama con el operador new."

Cuestiones relacionadas