¿Cuál es la verdadera diferencia entre declarar una matriz como esta:
var myArray = new Array();
y
var myArray = [];
javascript
arrays
declaration
Amr Elgarhy
fuente
fuente
[]
token:ARRAY_INIT
;new Array
fichas:NEW, IDENTIFIER
;new Array()
fichas:NEW, IDENTIFIER, CALL
Respuestas:
Hay una diferencia, pero no hay diferencia en ese ejemplo.
Usando el método más detallado:
new Array()
tiene una opción adicional en los parámetros: si pasa un número al constructor, obtendrá una matriz de esa longitud:Para ilustrar las diferentes formas de crear una matriz:
Otra diferencia es que cuando se usa
new Array()
puede establecer el tamaño de la matriz, lo que afecta el tamaño de la pila. Esto puede ser útil si obtiene desbordamientos de pila ( Rendimiento de Array.push vs Array.unshift ), que es lo que sucede cuando el tamaño de la matriz excede el tamaño de la pila, y debe volver a crearse. Entonces, en realidad, dependiendo del caso de uso, puede haber un aumento en el rendimiento cuando se usanew Array()
porque puede evitar que ocurra el desbordamiento.Como se señaló en esta respuesta , en
new Array(5)
realidad no agregará cincoundefined
elementos a la matriz. Simplemente agrega espacio para cinco elementos. Tenga en cuenta que el uso deArray
esta manera hace que sea difícil confiar en losarray.length
cálculos.fuente
La diferencia entre crear una matriz con la matriz implícita y el constructor de la matriz es sutil pero importante.
Cuando crea una matriz usando
Le está diciendo al intérprete que cree una nueva matriz de tiempo de ejecución. No es necesario ningún procesamiento adicional. Hecho.
Si utiliza:
Le estás diciendo al intérprete, quiero llamar al constructor "
Array
" y generar un objeto. Luego busca a través de su contexto de ejecución para encontrar el constructor al que llamar, y lo llama, creando su matriz.Puedes pensar "Bueno, esto no importa en absoluto. ¡Son lo mismo!". Lamentablemente no puedes garantizar eso.
Tome el siguiente ejemplo:
En el ejemplo anterior, la primera llamada alertará a 'SPARTA' como era de esperar. El segundo no lo hará. Terminarás viendo indefinido. También notará que b contiene todas las funciones nativas del objeto Array tales como
push
, donde el otro no.Si bien puede esperar que esto suceda, solo ilustra el hecho de que
[]
no es lo mismo quenew Array()
.Probablemente sea mejor usarlo
[]
si sabes que solo quieres una matriz. Tampoco sugiero ir y redefinir Array ...fuente
Hay una diferencia importante que ninguna respuesta ha mencionado todavía.
De esto:
Puedes pensar que
new Array(2)
es equivalente a[undefined, undefined]
, ¡ pero NO lo es!Probemos con
map()
:¿Ver? ¡La semántica es totalmente diferente! Entonces, ¿por qué es eso?
De acuerdo con la especificación ES6 22.1.1.2, el trabajo de
Array(len)
es simplemente crear una nueva matriz cuya propiedadlength
se establece en el argumentolen
y eso es todo, lo que significa que no hay ninguna elemento real dentro de esta matriz recién creada.La función
map()
, de acuerdo con la especificación 22.1.3.15, primero verificaría yHasProperty
luego llamaría a la devolución de llamada, pero resulta que:Y es por eso que no puede esperar que ninguna función iterativa funcione como de costumbre en matrices creadas a partir de
new Array(len)
.Por cierto, Safari y Firefox tienen una "impresión" mucho mejor para esta situación:
Ya he enviado un problema a Chromium y les pido que arreglen esta impresión confusa: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
ACTUALIZACIÓN: Ya está arreglado. Chrome ahora impreso como:
fuente
[...Array(2)]
que es equivalente[undefined, undefined]
desde el punto de vista de los resultados.undefined
como de costumbre.Por extraño que parezca,
new Array(size)
es casi 2 veces más rápido que[]
en Chrome, y casi lo mismo en FF e IE (medido mediante la creación y el llenado de una matriz). Solo importa si conoce el tamaño aproximado de la matriz. Si agrega más elementos que la longitud que ha asignado, se pierde el aumento de rendimiento.Más exactamente:
Array(
es una operación rápida de tiempo constante que no asigna memoria, mientras que[]
es una operación de tiempo lineal que establece el tipo y el valor.fuente
new Array(length)
en 0 <= size <= ~ 1000, en tamaño> ~ 1000 victorias[]
Para obtener más información, la siguiente página describe por qué nunca necesita usar
new Array()
Consulte también los comentarios: el
new Array(length)
formulario no tiene ningún propósito útil (al menos en las implementaciones actuales de JavaScript).fuente
Para comprender mejor
[]
ynew Array()
:El resultado anterior es de la consola Google Chrome en Windows 7.
fuente
Array(3)
onew Array(3)
no es lo mismo que[3]
.El primero es la llamada del constructor de objetos predeterminado. Puede usar sus parámetros si lo desea.
El segundo le brinda la capacidad de crear una matriz no vacía:
fuente
var array = [5]
usando los corchetes pero sin usar el constructor, yavar array = Array(5)
que forma una matriz vacía de 5 elementos.Puedo explicar de una manera más específica comenzando con este ejemplo que se basa en el buen Fredrik.
Acabo de agregar otro valor a las matrices e hice cuatro alertas: la primera y la segunda son para darnos el valor almacenado en cada matriz, para estar seguros de los valores. ¡Volverán lo mismo! Ahora prueba el tercero, devuelve falso, eso es porque
La primera diferencia es que cuando llamamos a test1, llama a una variable sin pensar, ¡simplemente devuelve los valores almacenados en esta variable sin tener en cuenta su tipo de datos! Pero, cuando llamamos a test2, llama a la función Array () y luego almacena nuestros valores "Empujados" en su propiedad "Valor" , y lo mismo ocurre cuando alertamos a test2, devuelve el "Valor" propiedad del objeto de matriz.
Entonces, cuando verificamos si test1 es igual a test2, por supuesto, nunca devolverán verdadero, uno es una función y el otro es una variable (con un tipo de matriz), ¡incluso si tienen el mismo valor!
Para estar seguro de eso, intente la 4ta alerta, con el valor agregado; Volverá cierto. En este caso, le decimos a JS "Sin tener en cuenta el tipo de contenedor, ya sea funcional o variable, compare los valores almacenados en cada contenedor y díganos lo que ha visto". eso es exactamente lo que pasa.
Espero haber dicho claramente la idea detrás de eso, y lo siento por mi mal inglés.
fuente
[]
ynew Array()
es idéntico.value
seráundefined
en ambos casos, y compararlos siempre será falso.array.value
. y ambostypeof []
ytypeof new Array()
regresoobject
. Es una de las razones por las que hay una función llamadaArray.isArray
No hay diferencia cuando inicializa la matriz sin ninguna longitud. Entonces
var a = []
yvar b = new Array()
es lo mismo.Pero si inicializa la matriz con una longitud similar
var b = new Array(1);
, establecerá la longitud del objeto de la matriz en 1. Por lo tanto, es equivalente avar b = []; b.length=1;
.Esto será problemático cada vez que haga array_object.push, agregará un elemento después del último elemento y aumentará la longitud.
vs
fuente
El primero es la llamada al constructor de objetos predeterminado. Se usa principalmente para valores dinámicos.
la segunda matriz se usa al crear valores estáticos
fuente
No hay una gran diferencia, básicamente hacen lo mismo pero haciéndolos de diferentes maneras, pero sigue leyendo, mira esta declaración en W3C:
y
Pero al mismo tiempo, crear una nueva matriz utilizando la
new Array
sintaxis se considera una mala práctica:Así que, básicamente, no se considera como la mejor práctica, también hay una pequeña diferencia allí, puede pasar la longitud de
new Array(length)
esta manera, lo que tampoco es una forma recomendada.fuente
new Array(40).fill(123)
La diferencia de usar
O
Como se ha discutido lo suficiente en esta pregunta.
Me gustaría agregar el problema de la velocidad, la forma más rápida actual , en
google chrome
es la segunda.Pero presta atención, estas cosas tienden a cambiar mucho con las actualizaciones. Además, el tiempo de ejecución diferirá entre los diferentes navegadores.
Por ejemplo, la segunda opción que mencioné, se ejecuta a 2 millones [ops / segundo] en adelante
chrome
, pero si la probarasmozilla dev.
obtendría una tasa sorprendentemente más alta de 23 millones.De todos modos, te sugiero que lo revises, de vez en cuando, en diferentes navegadores (y máquinas), usando el sitio como tal
fuente
Como sé, la diferencia puede encontrar el segmento (u otras funciones de Array) como el código1. Y el código2 muestra Array y sus instancias :
código1:
código2:
conclusión:
como puede ver
[]
ynew Array()
crear una nueva instancia de Array. Y todos obtienen las funciones prototipo deArray.prototype
Son simplemente una instancia diferente de Array. Esto explica por qué
[] != []
:)
fuente
He incurrido en un comportamiento extraño usando [].
Tenemos "clases" de modelo con campos inicializados a algún valor. P.ej:
Descubrí que cuando se inicializan los campos,
[]
todos los objetos Modelo los compartirían. Hacer cambios a uno afecta a todos los demás.Esto no sucede inicializándolos con
new Array()
. Lo mismo para la inicialización de objetos ({}
vs nuevoObject()
)TBH No estoy seguro si es un problema con el marco que estábamos usando ( Dojo )
fuente
Hay más en esto de lo que parece. La mayoría de las otras respuestas son correctas, PERO TAMBIÉN ...
new Array(n)
n
elementos[1, 2, 3] || []
delete
o[1,,3]
sintaxis)for ..
,forEach
,map
, etc.)fuente
He encontrado una diferencia entre las dos construcciones que me han picado bastante.
Digamos que tengo:
En la vida real, si hago esto:
Lo que termino con es esto:
No sé qué se supone que sucederá en la especificación del lenguaje, pero si quiero que mis dos objetos tengan matrices de propiedades únicas en mis objetos, tengo que usarlos
new Array()
.fuente
[]
y elnew Array()
constructor, lo que da como resultado un elemento por matriz por propiedad. Debe tener algo más en su código para terminar con el resultado que muestra arriba.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
El uso del constructor Array crea una nueva matriz de la longitud deseada y llena cada uno de los índices con indefinido, la matriz asignada a una variable crea los índices para los que le da información.
fuente