¿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()

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.

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.


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.


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 ...


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.


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.


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.


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.


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!


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.