¿Crear un objeto vacío en JavaScript con {} o un nuevo Object ()?

370

Hay dos formas diferentes de crear un objeto vacío en JavaScript:

var objectA = {}
var objectB = new Object()

¿Hay alguna diferencia en cómo los maneja el motor de script? ¿Hay alguna razón para usar uno sobre el otro?

Del mismo modo, también es posible crear una matriz vacía utilizando una sintaxis diferente:

var arrayA = []
var arrayB = new Array()
Jonas Pegerfalk
fuente
66
Advertencia: hay una pequeña diferencia que puede causar errores muy irritantes. Crear un objeto vacío asignándolo a "{}" en un prototipo de Objeto será la misma instancia de Objeto en cada instancia de Objeto creada por un operador "nuevo". Mientras usa "nuevo Objeto ({})", tendrá diferentes instancias.
peterh - Restablece a Mónica el
Vale la pena mencionar que, además de var objectA = {} var objectB = new Object()hay un tercer constructo que producirá el mismo resultado:var objectC = Object.create(Object.prototype);
kalitsov
{}y [] usar en {}lugar de new Object(). Usar en []lugar de new Array(). Use matrices cuando los nombres de los miembros serían enteros secuenciales. Use objetos cuando los nombres de los miembros sean cadenas o nombres arbitrarios. fuente
ilgaar
new Object()y {}no son objetos completamente vacíos, son objetos que tienen el prototipo Object. Puede usarlo Object.create(null)para un objeto verdaderamente vacío (al menos de acuerdo con los documentos de mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )

Respuestas:

459

Objetos

El uso no tiene ningún beneficio new Object();, mientras que {};puede hacer que su código sea más compacto y más legible.

Para definir objetos vacíos son técnicamente iguales. La {}sintaxis es más corta, más ordenada (menos Java-ish) y le permite llenar instantáneamente el objeto en línea, de esta manera:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

Matrices

Para las matrices, de manera similar, casi no hay ningún beneficio al usar en new Array();exceso [];, con una pequeña excepción:

var emptyArray = new Array(100);

crea una matriz larga de 100 elementos con todas las ranuras que contienen undefined, lo que puede ser agradable / útil en ciertas situaciones (como (new Array(9)).join('Na-Na ') + 'Batman!').

Mi recomendación

  1. Nunca lo use new Object();: es más grueso que {};y parece tonto.
  2. Utilice siempre [];, excepto cuando necesite crear rápidamente una matriz "vacía" con una longitud predefinida.
Már Örlygsson
fuente
22
Incluso si utiliza la sintaxis Array (100), esa misma matriz, en la posición 101, no se ha definido en ella; lo único que ese número realmente hace es cambiar el valor de la propiedad de longitud.
Jason Bunting
66
@Pablo no hay nada inválido new Array(100). Lea la literatura: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Már Örlygsson
99
@Pablo No tengo idea de cuál es tu argumento. Al igual que Douglas Crockford, recomiendo usar []. No hay discusión allí. Sin embargo, usted argumentó que de new Array(100)alguna manera es "inválido", lo cual es falso.
Már Örlygsson
10
Además, tenga en cuenta que new Array(1,2,3)da como resultado [1,2,3], pero new Array(1)no da como resultado [1]; así, la semántica de Arrayes inconsistente e innecesariamente confusa.
Dancrumb
3
Agregaría que Object.create(null)puede ser útil para crear un objeto en blanco, mientras que { }hereda del prototipo de Objeto.
Miau
90

Sí, hay una diferencia, no son lo mismo. Es cierto que obtendrá los mismos resultados, pero el motor funciona de manera diferente para ambos. Uno de ellos es un objeto literal, y el otro es un constructor, dos formas diferentes de crear un objeto en javascript.

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

En JS todo es un objeto, pero debe tener en cuenta lo siguiente con el nuevo Object (): puede recibir un parámetro y, según ese parámetro, creará una cadena, un número o simplemente un objeto vacío.

Por ejemplo:, new Object(1)devolverá un Número. new Object("hello")devolverá una cadena, significa que el constructor del objeto puede delegar -dependiendo del parámetro- la creación del objeto a otros constructores como cadena, número, etc. Es muy importante tener esto en cuenta cuando administra datos dinámicos para crear objetos ..

Muchos autores recomiendan no usar el constructor de objetos cuando puede usar una cierta notación literal en su lugar, donde estará seguro de que lo que está creando es lo que espera tener en su código.

Le sugiero que lea más sobre las diferencias entre la notación literal y los constructores en JavaScript para encontrar más detalles.

Guillermo Snipe
fuente
La notación literal es, de hecho, más legible y concisa para crear objetos de datos dinámicos.
Sid
12

Estos tienen el mismo resultado final, pero simplemente agregaría que usar la sintaxis literal puede ayudar a uno a acostumbrarse a la sintaxis de JSON (un subconjunto de sintaxis literal de sintaxis de JavaScript), por lo que podría ser una buena práctica entrar .

Otra cosa: es posible que tenga errores sutiles si olvida usar el newoperador. Entonces, usar literales lo ayudará a evitar ese problema.

En última instancia, dependerá de la situación y de las preferencias.

Jason Bunting
fuente
8

La sintaxis literal de objeto y matriz {} / [] se introdujo en JavaScript 1.2, por lo que no está disponible (y producirá un error de sintaxis) en las versiones de Netscape Navigator anteriores a 4.0.

Mis dedos todavía prefieren decir nuevo Array (), pero soy un hombre muy viejo. Afortunadamente, Netscape 3 no es un navegador que muchas personas tienen que considerar hoy ...

bobince
fuente
11
Netscape 3? Hombre, eso fue en el siglo anterior ! :-D
Tomalak
8
var objectA = {}

es mucho más rápido y, en mi experiencia, se usa más comúnmente, por lo que probablemente sea mejor adoptar el 'estándar' y guardar algo de escritura.

Bobby Jack
fuente
1
¿Más rápido de ejecutar o simplemente más rápido de escribir?
hippietrail
Bueno, lo admito, quise decir "escribir" pero, dado el tiempo de análisis adicional, probablemente también un poco más rápido de ejecución :-)
Bobby Jack
2
Además, los literales generalmente se crean en tiempo de análisis, mientras que new Objectdeben ejecutarse en tiempo de ejecución.
Phrogz
8

Creo que {}fue recomendado en uno de los videos Javascript aquí como una buena convención de codificación. newEs necesario para la herencia pseudoclásica. el var obj = {};camino ayuda a recordarle que este no es un lenguaje clásico orientado a objetos sino un prototipo. Por lo tanto, el único momento que realmente necesitaría newes cuando está utilizando funciones de constructores. Por ejemplo:

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

Luego se usa así:

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

Otra ventaja de usar {}como opuesto a new Objectes que puede usarlo para hacer literales de objetos de estilo JSON.

Thedric Walker
fuente
7

Rendimiento de instanciación de matriz

Si desea crear una matriz sin longitud:

var arr = []; es más rápido que var arr = new Array();

Si desea crear una matriz vacía con una cierta longitud:

var arr = new Array(x);es más rápido que var arr = []; arr[x-1] = undefined;

Para puntos de referencia, haga clic en lo siguiente: https://jsfiddle.net/basickarl/ktbbry5b/

Sin embargo, no conozco la huella de memoria de ambos, me imagino que new Array()ocupa más espacio.

K - La toxicidad en SO está creciendo.
fuente
arr = new Array(x)es equivalente a arr = []; arr.length = x;no asignar el x-1índice con undefined.
Bergi
2

Esto es esencialmente lo mismo. Use lo que le parezca más conveniente.

Tomalak
fuente
Tal vez estoy profundizando demasiado en JavaScript aquí, pero ¿son lo mismo? ¿No es el {proto} de Objectes nulo, mientras que el {proto} de {}es 'Object.prototype'?
Izhaki
@Izhaki El prototipo de Objectes nulo, eso es correcto. Eso es porque Objecttermina la cadena del prototipo. Sin embargo, las instancias de objeto no tienen un prototipo, solo los constructores tienen uno. Y (new Object()).constructor === ({}).constructor->true
Tomalak
Entonces, ¿ esto es incorrecto?
Izhaki
Aquí está mi punto: new Object()produce una instancia de objeto en blanco. {}produce una instancia de objeto en blanco. Ambas instancias son absolutamente indistinguibles. El ejemplo al que se vincula hace algo más (modifica la cadena del prototipo) y realmente no se aplica aquí, o no entiendo su argumento.
Tomalak
1

OK , ¡solo hay 2 formas diferentes de hacer lo mismo! ¡Uno llamado object literaly el otro es una función constructor!

Pero sigue leyendo, hay un par de cosas que me gustaría compartir:

El uso {}hace que su código sea más legible, al tiempo que crea instancias Objectu otras funciones integradas no recomendadas ...

Además, la función Object obtiene parámetros ya que es una función, como Object(params)... pero {}es una forma pura de iniciar un objeto en JavaScript ...

El uso de objetos literales hace que su código se vea mucho más limpio y fácil de leer para otros desarrolladores y está en línea con las mejores prácticas en JavaScript ...

Si bien Object en Javascript puede ser casi cualquier cosa, {}solo apunta a objetos javascript, para probar cómo funciona, haga lo siguiente en su código o consola javascript:

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

Sorprendentemente, ¡está creando un Número!

var a = new Object([1,2,3]); //[1, 2, 3]

¡Y esto está creando una matriz!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

y este extraño resultado para String!

Entonces, si está creando un objeto, se recomienda usar un objeto literal, para tener un código estándar y evitar cualquier accidente de código como el anterior, ¡también el uso inteligente en cuanto al rendimiento {}es mejor en mi experiencia!

Alireza
fuente
eres Dezfooli? ¿en Iran?
Ehsan
Hola Ehsan, sí, pero no estoy viviendo en Irán, amigo, ¡tienes un gran perfil aquí! Encantado de conocerte ...
Alireza
¿Puedo guardar su número de teléfono y obtener ayuda sobre programación?
Ehsan
Veo que usas telegrama.
Ehsan
Sí, claro, ¡podemos compartir algunos conocimientos sobre telegramas con seguridad! ___
Alireza