¿Está garantizado un orden de matriz de JavaScript?

3 minutos de lectura

avatar de usuario
Rafael Herscovici

Suponiendo que una matriz de JavaScript se publique en un formulario (usando ajax/JQuery), ¿se garantiza el orden en la matriz?

Pregunta válida de @Quentin “Definir ‘publicado en un formulario'”

$.ajax({
  type: "POST",
  url: url,
  data: { foo: [{ name: "one" }, { name: "two" }] },
  success: success,
  dataType: dataType
});

Ampliando la pregunta (debido a lo anterior), ¿se garantiza que la matriz conserve el orden en el lado del servidor?

  • Los arreglos son colecciones ordenadas.

    – menos cuatro

    22/01/2016 a las 20:55

  • Me he encontrado con situaciones en las que no se conservó el orden (en otros idiomas), de ahí la pregunta.

    –Rafael Herscovici

    22 de enero de 2016 a las 20:56

  • ¿Qué idiomas y cómo reproducir esto?

    – Sebastián Simón

    22 de enero de 2016 a las 20:58

  • mi opinión: el problema de “confianza” con esa publicación de blog es una persona que no entiende las matrices.

    – epascarello

    22 de enero de 2016 a las 21:03

  • Si las matrices no tuvieran un orden garantizado, tendríamos un problema. Las claves de objeto, por otro lado, no tienen un orden garantizado.

    – epascarello

    22 de enero de 2016 a las 21:06


avatar de usuario
Nicola Bizzoca

Siempre puede consultar el estándar ECMAScript cuando tenga dudas: Matriz de objetos exóticos

Array es un tipo especial de objeto en el lenguaje que tiene una semántica adicional sobre cómo se maneja la propiedad de longitud con respecto a las propiedades que son números enteros de 0 a 2^32. En javascript, una matriz puede ser escasa si faltan valores en el rango de 0 a la propiedad de longitud excluida. Varios métodos de matriz toman esto en consideración, por ejemplo para cada ignorar los valores perdidos

¿Qué es un valor faltante?

El lenguaje trata de hacer que las matrices actúen tanto como sea posible como para los objetos normales: puede agregarle cualquier propiedad e incluso tener objetos que hereden de una matriz.

var fruits = ["Apple", "Banana"];
fruits.preferred = "Apple";

Este tipo de código no plantea ningún problema, pero si empiezas a escribir:

fruits[100] = "Strawberry";
for(let i = 0; i < fruits.length; ++i) {
...
}

100 es un nombre de propiedad en el rango de [0, 2^32) so is an array element but at this point what fruits.length should be? It must be 101, otherwise the for loop will never get “Strawberry”.

But at this point you have to accept that there is a range of element [2, 99] que nunca se definieron: estos son valores faltantes.

Viceversa, lo mismo debe ser cierto cuando modifica la propiedad de longitud

var fruits = ["Apple", "Banana"];
fruits.length = 0;

Ahora, un bucle for nunca obtendrá ningún elemento de la matriz: esto es equivalente a vaciar la matriz de frutas.

También es posible incrementar la longitud, con el resultado de tener valores faltantes

Entonces, sí, las matrices están ordenadas, ya que puede iterar todos sus elementos en orden creciente, pero tenga en cuenta que pueden faltar valores

  • ¿Puedes ampliar Missing Values ?

    –Rafael Herscovici

    22 de enero de 2016 a las 21:27

  • Gracias, esto es similar a la publicación de blog con la que comenté, pero estoy bastante seguro de que otros encontrarán esto útil.

    –Rafael Herscovici

    22 de enero de 2016 a las 22:24

  • Lo hace forEach iterar en orden creciente?

    – Nathan Goings

    5 de noviembre de 2018 a las 23:56

¿Ha sido útil esta solución?