validar validacion manejo leer formularios formulario enviar ejemplos contenido con carga asincrona archivos archivo antes javascript

validacion - ¿JavaScript garantiza la orden de la propiedad del objeto?



validar formulario javascript html5 (8)

Si creo un objeto como este:

var obj = {}; obj.prop1 = "Foo"; obj.prop2 = "Bar";

¿El objeto resultante siempre se verá así?

{ prop1 : "Foo", prop2 : "Bar" }

Es decir, ¿estarán las propiedades en el mismo orden en que las agregué?


Como han dicho otros, no tiene ninguna garantía en cuanto al orden cuando itera sobre las propiedades de un objeto. Si necesita una lista ordenada de varios campos, sugerí crear una matriz de objetos.

var myarr = [{somfield1: ''x'', somefield2: ''y''}, {somfield1: ''a'', somefield2: ''b''}, {somfield1: ''i'', somefield2: ''j''}];

De esta manera puede usar un bucle for regular y tener el orden de inserción. Luego, puede usar el método de clasificación de Array para clasificar esto en una nueva matriz si es necesario.


Desde el estándar JSON :

Un objeto es una colección desordenada de cero o más pares de nombre / valor, donde un nombre es una cadena y un valor es una cadena, número, booleano, nulo, objeto o matriz.

(énfasis mío).

Por lo tanto, no se puede garantizar el pedido.


El orden de las propiedades en los objetos normales es un tema complejo en Javascript.

Mientras que en ES5 explícitamente no se ha especificado un pedido, ES2015 tiene un pedido en ciertos casos. Dado es el siguiente objeto:

o = Object.create(null, { m: {value: function() {}, enumerable: true}, "2": {value: "2", enumerable: true}, "b": {value: "b", enumerable: true}, 0: {value: 0, enumerable: true}, [Symbol()]: {value: "sym", enumerable: true}, "1": {value: "1", enumerable: true}, "a": {value: "a", enumerable: true}, });

Esto resulta en el siguiente orden (en ciertos casos):

Object { 0: 0, 1: "1", 2: "2", b: "b", a: "a", m: function() {}, Symbol(): "sym" }

  1. teclas de tipo entero en orden ascendente
  2. teclas normales en orden de inserción
  3. Símbolos en orden de inserción

Por lo tanto, hay tres segmentos, que pueden alterar el orden de inserción (como sucedió en el ejemplo). Y las teclas de tipo entero no se mantienen en absoluto en el orden de inserción.

La pregunta es, ¿para qué métodos se garantiza este orden en la especificación ES2015?

Los siguientes métodos garantizan el orden mostrado:

  • Object.assign
  • Object.defineProperties
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • Reflect.ownKeys

Los siguientes métodos / bucles no garantizan ningún pedido:

  • Object.keys
  • para ... en
  • JSON.parse
  • JSON.stringify

Conclusión: incluso en ES2015 no debe confiar en el orden de las propiedades de los objetos normales en Javascript. Es propenso a los errores. Utilice el Map lugar.


En el momento de redactar este documento, la mayoría de los navegadores devolvían las propiedades en el mismo orden en que se insertaron, pero no se garantizó explícitamente el comportamiento, por lo que no se debió confiar en ellas.

La especificación ECMAScript solía decir:

La mecánica y el orden de enumerar las propiedades ... no se especifica.

Sin embargo, en ES2015 y posteriores, las claves no enteras se devolverán en el orden de inserción.


En los navegadores modernos, puede utilizar la estructura de datos del Map lugar de un objeto.

Desarrollador mozilla> Mapa

Un objeto Map puede iterar sus elementos en orden de inserción ...


No, el orden de las propiedades en los objetos no está garantizado en JavaScript; Necesitas usar un Array .

Definición de un Objeto de ECMAScript Tercera Edición (pdf) :

4.3.3 objeto

Un objeto es un miembro del tipo Object. Es una colección desordenada de propiedades, cada una de las cuales contiene un valor, objeto o función primitivos. Una función almacenada en una propiedad de un objeto se llama método.

Desde ECMAScript 2015 , usar el objeto Map podría ser una alternativa. Un Map comparte algunas similitudes con un Object y garantiza el orden de las claves :

Un mapa itera sus elementos en orden de inserción, mientras que el orden de iteración no se especifica para los objetos.


Toda esta respuesta se encuentra en el contexto del cumplimiento de especificaciones, no como lo hace cualquier motor en un momento particular o históricamente.

En general, no

La pregunta real es muy vaga.

¿Estarán las propiedades en el mismo orden en que las agregué?

¿En que contexto?

La respuesta es: depende de una serie de factores. En general, no .

A veces sí

Aquí es donde puede contar con el orden de la clave de propiedad para los Objects simples:

  • Motor compatible con ES2015
  • Propiedades propias
  • Object.getOwnPropertyNames() , Reflect.ownKeys() , Object.getOwnPropertySymbols(O)

En todos los casos, estos métodos incluyen claves de propiedad no enumerables y claves de pedido según lo especificado por [[OwnPropertyKeys]] (ver más abajo). Se diferencian en el tipo de valores clave que incluyen ( String y / o Symbol ). En este contexto, la String incluye valores enteros.

Object.getOwnPropertyNames(O)

Devuelve las propias propiedades de clave de String O ( nombres de propiedades ).

Reflect.ownKeys(O)

Devuelve las propias propiedades de clave de String y Symbol .

Object.getOwnPropertySymbols(O)

Devuelve las propiedades propias de los Symbol O.

[[OwnPropertyKeys]]

El orden es esencialmente: Strings tipo entero en orden ascendente, Strings de tipo no entero en orden de creación, símbolos en orden de creación. Dependiendo de qué función invoca esto, algunos de estos tipos pueden no estar incluidos.

El idioma específico es que las claves se devuelven en el siguiente orden:

  1. ... cada clave de propiedad propia P de O [el objeto que se está iterando] que es un índice entero, en orden de índice numérico ascendente

  2. ... cada clave de propiedad propia P de O que es una Cadena pero no es un índice entero, en el orden de creación de la propiedad

  3. ... cada clave de propiedad propia P de O que es un Símbolo, en el orden de creación de propiedad

Map

Si está interesado en mapas ordenados, debe considerar el uso del tipo de Map introducido en ES2015 en lugar de Objects simples.


Especificación actual del idioma : técnicamente, el orden no está especificado.

Navegadores actuales : el orden se conserva con la excepción principal de teclas como "7" que se analizan como enteros y se manejan de manera diferente en Chrome / V8.

Especificación de idioma futuro (> ES2015) : En general, puede esperar que las cosas ordenadas hoy no queden desordenadas. Nuevas APIs garantizarán el orden; Las API existentes son difíciles de cambiar. Vea la respuesta de JMM para más detalles.

El mejor enlace a continuación está en el comentario de Tim Down:

http://code.google.com/p/v8/issues/detail?id=164

Ese error cubre en detalle las decisiones de diseño involucradas para la implementación de Chrome del pedido de claves. Una conclusión es que para las claves de cadena que no se analizan en un entero (es decir, "a" o "b", pero NO "3"), las claves se imprimen en orden de inserción en todos los navegadores principales y, si bien este comportamiento no es "estandarizado", se considera un problema significativo de compatibilidad con versiones anteriores por parte de los proveedores de navegadores. Úselo bajo su propio riesgo.

Según uno de los comentarios (más bien opinados):

Los estándares siempre siguen las implementaciones, de ahí es de donde vino XHR, y Google hace lo mismo al implementar Gears y luego abrazar la funcionalidad equivalente de HTML5. La solución correcta es que ECMA incorpore formalmente el comportamiento estándar de facto en la próxima revolución de la especificación.

Si confía en el orden de inserción, está fuera de la especificación ECMAScript, pero dentro del estándar de facto del comportamiento común del navegador siempre que sus claves no se analicen como enteros .