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()
javascript
arrays
object
javascript-objects
new-operator
Jonas Pegerfalk
fuente
fuente
var objectA = {} var objectB = new Object()
hay un tercer constructo que producirá el mismo resultado:var objectC = Object.create(Object.prototype);
{}
y[]
usar en{}
lugar denew Object()
. Usar en[]
lugar denew 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. fuentenew Object()
y{}
no son objetos completamente vacíos, son objetos que tienen el prototipo Object. Puede usarloObject.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:
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: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: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
new Object();
: es más grueso que{};
y parece tonto.[];
, excepto cuando necesite crear rápidamente una matriz "vacía" con una longitud predefinida.fuente
new Array(100)
. Lea la literatura: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…[]
. No hay discusión allí. Sin embargo, usted argumentó que denew Array(100)
alguna manera es "inválido", lo cual es falso.new Array(1,2,3)
da como resultado[1,2,3]
, peronew Array(1)
no da como resultado[1]
; así, la semántica deArray
es inconsistente e innecesariamente confusa.Object.create(null)
puede ser útil para crear un objeto en blanco, mientras que{ }
hereda del prototipo de Objeto.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.
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.
fuente
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
new
operador. Entonces, usar literales lo ayudará a evitar ese problema.En última instancia, dependerá de la situación y de las preferencias.
fuente
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 ...
fuente
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.
fuente
new Object
deben ejecutarse en tiempo de ejecución.Creo que
{}
fue recomendado en uno de los videos Javascript aquí como una buena convención de codificación.new
Es necesario para la herencia pseudoclásica. elvar 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íanew
es cuando está utilizando funciones de constructores. Por ejemplo:Luego se usa así:
Otra ventaja de usar
{}
como opuesto anew Object
es que puede usarlo para hacer literales de objetos de estilo JSON.fuente
Rendimiento de instanciación de matriz
Si desea crear una matriz sin longitud:
var arr = [];
es más rápido quevar arr = new Array();
Si desea crear una matriz vacía con una cierta longitud:
var arr = new Array(x);
es más rápido quevar 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.fuente
arr = new Array(x)
es equivalente aarr = []; arr.length = x;
no asignar elx-1
índice conundefined
.Esto es esencialmente lo mismo. Use lo que le parezca más conveniente.
fuente
Object
es nulo, mientras que el {proto} de{}
es 'Object.prototype'?Object
es nulo, eso es correcto. Eso es porqueObject
termina 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
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.OK , ¡solo hay 2 formas diferentes de hacer lo mismo! ¡Uno llamado
object literal
y el otro es una funciónconstructor
!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 instanciasObject
u 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:Sorprendentemente, ¡está creando un Número!
¡Y esto está creando una matriz!
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!fuente