Me pregunto si JavaScript tiene una mayor bucle for sintaxis que permite recorrer a través de matrices. Por ejemplo, en Java, usted puede simplemente hacer lo siguiente:

String[] array = "hello there my friend".split(" ");

for (String s : array){
    System.out.println(s);
}

la salida es:

hello
there
my
friend

Hay una manera de hacer esto en JavaScript? O tengo que usar array.length y el uso estándar para el bucle de la sintaxis como la siguiente?

var array = "hello there my friend".split(" ");

for (i=0;i<array.length;i++){
    document.write(array[i]);
}
InformationsquelleAutor ewok | 2011-12-30

7 Comentarios

  1. 25

    JavaScript tiene una foreachestilo de bucle (for (x in a)), pero es muy mala práctica de codificación a utilizar en un Array. Básicamente, el array.length enfoque es correcto. También hay un a.forEach(fn) método en las nuevas JavaScripts puede utilizar, pero esto no está garantizado a estar presente en todos los navegadores y es más lento que el array.length manera.

    EDICIÓN de 2017: «vamos a ver cómo va», de hecho. En la mayoría de los motores de ahora, .forEach() ahora es tan rápido o más rápido que for(;;), mientras la función está en línea, es decir, arr.forEach(function() { ... }) es rápido, foo = function() { ... }; arr.forEach(foo) podría no ser. Uno podría pensar que los dos deben ser idénticos, pero el primero es más fácil para el compilador para optimizar de la segunda.

    • Esos mismos nuevos javascripts tratar los índices de matriz como de primera clase de propiedades, lo que hace menos de una mala práctica. (Todavía es peligroso si usted está apoyando mayores js motores de curso, o si su Matriz hereda las propiedades y no comprobar eso. Cohete de la respuesta de la siguiente muestra de esto.)
    • Sí, esa es la cosa – tienes que prometer que nunca para extender una matriz o su prototipo. Asimismo, la orden no está garantizada. También, contradictorio, pero completamente lógicamente una vez que usted sepa lo que está pasando, los índices son representaciones de cadena de números. También, si usted tiene unset elementos, no van a ser iterado. a = []; a[3] = 5; for (i in a) { console.log(i, typeof(i)); } da 3 string sólo, muy distinta es la consecuencia de la array.length método.
    • respuesta no te protegen de las propiedades establecidas en el objeto en sí. a = [1,2,3]; a.listIndices = function() { for (i in a) { if (a.hasOwnProperty(i)) { console.log(i); } } }; a.listIndices() mostrará una lista de 0; 1; 2; listIndices.
    • Unset elementos no se pueden recorrer en forEach bien.
    • Estás en lo correcto. Afortunadamente, será saltar a cualquiera no numéricos de los índices como listProperty arriba.
    • Por favor, evitar todos estos problemas potenciales, y sólo tiene que utilizar una aplicación que se ha diseñado para este propósito: forEach (mencionada al final de esta respuesta, además con detalles en mi propia respuesta.)
    • No es así de simple. Si me iba para el rendimiento, estoy totalmente en su lugar usar array.length método (con valor almacenado en caché). jsperf.com/for-vs-foreach/9
    • esa es una gran demostración, gracias por la respuesta. Ahora, sería muy interesante ver cómo gran parte de esta disparidad está optimizado lejos por navegador con JavaScript mejoras en los próximos meses y años. 🙂
    • En cierto modo, sí. Ruby lo hace, por tener los bloques que no están los objetos, ni las funciones, sino sólo fragmentos de código. Lo que creo es que el retraso JS abajo es el hecho de que usted tiene que invocar una función en cada paso de la forEach. Vamos a ver cómo va.

  2. 11

    Utilizando las últimas versiones de JavaScript disponibles para la mayoría de los navegadores modernos, usted puede hacer esto:

    array.forEach(function(x){
      document.write(x);
    });

    Detalles en https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach. Si usted está preocupado de que un navegador no tiene soporte para esto, se puede agregar usted mismo, usando un (esperemos record) versión de la aplicación que tienen en la lista debajo de «Compatibilidad».

    Este es un poco anticuado, pero esto es un record de compatibilidad de la versión de forEach que deriva de Mozilla página hace un par de años:

    if(!Array.prototype.forEach){Array.prototype.forEach=function(b){if(typeof b!="function"){throw new TypeError()}var a=this.length,d=arguments[1],c;for(c=0;c<a;c++){if(c in this){b.call(d,this[c],c,this)}}}};

    No he visto nunca ningún problema con esto, pero la aplicación en la página de Mozilla desde entonces se ha ampliado con algunas comprobaciones adicionales y el código para que sea compatible con ECMA-262, Edición 5, 15.4.4.18.

    Tengo un archivo llamado common.js que yo uso y se incluyen en todas mis páginas para incluir este, así como todos los demás «Matriz extras» que se introdujeron con JavaScript 1.6, como aparece en https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras. (He tenido la intención de obtener esta actualizado y publicado para el uso público.)

    Este no puede ser el enfoque más rápido (ver http://jsperf.com/for-vs-foreach/15 para algunos detalles – gracias por el enlace, Amadan) -, pero hay algo que decir acerca de la concisión y la facilidad de mantenimiento, etc. Además, va a ser muy interesante ver cómo gran parte de esta disparidad está optimizado lejos por mayor motor de JavaScript mejoras en los próximos meses y años. 🙂

  3. 5

    En ES2015(ES6), puede utilizar el for-of bucle. Es compatible en la mayoría de navegador con la excepción de la IE.

    let array = [10, 20, 30];
    
    for (let value of array) {
      console.log(value);
    }

    Ver el Mozilla explicación aquí

    • Bueno concisa y completa respuesta.
  4. 3

    Que usted puede hacer for(s in array), pero cuidado, no es el mismo que el de un foreach.

    En este caso s es la clave (índice), no el valor. También es necesario utilizar hasOwnProperty porque in bucles aunque el objeto del prototype también.

    for(s in array){
        if(array.hasOwnProperty(s)){
            console.log(array[s]);
        }
    }

    EDIT: Como @Amadan señaló, hasOwnProperty hace recorrer propiedades cuando se haya agregado como este: array.test = function(){}. Sugiero no utilizando for...in.

    EDIT2: Si el uso de un navegador web moderno (nada que no IE < 9), puede utilizar Array.forEach). @ziesemer señala que Mozilla tiene una calza para esto si usted necesita para apoyar el IE < 9.

    array.forEach(function(s){
        console.log(s);
    });

    NOTA: Personalmente yo uso jQuery para mis proyectos de JavaScript, y yo uso $.cada.

    $.each(array, function(i,s){
        console.log(s);
    });
    • Por qué no usar simplemente forEach? (Ver Amadan o de mi respuesta.) Incluso este enfoque puede romperse si las cosas son asignados directamente a la matriz que no están destinados para ser indexado incluso si no a través del prototipo.
    • No todos los navegadores (bueno, yo creo que todos, pero IE) apoyo Array.prototype.forEach.
    • Los índices de matriz como de primera clase, las propiedades de la matriz son una característica relativamente nueva para Javascript, ¿no? ¿Sabe usted en qué versión de esta sintaxis se introdujo?
    • No tengo ni idea, pensaba que siempre fueron. También me han enseñado a utilizar siempre hasOwnProperty cuando se utiliza for...in.
    • forEach se admite como de IE 9. Para versiones anteriores, la compatibilidad de la función vinculada a la de mi respuesta puede ser usado para añadir soporte para el mismo.
    • Personalmente, creo que el uso de jQuery, así que uso $.each.
    • Seguro, Crockford aboga por que, pero lo que no dicen es que .hasOwnProperty no es un método de varios objetos del núcleo (window, document, HTMLElement, …) en las jscript y los objetos no puede ser prolongado.
    • Eso es porque IE (IE < 9) JScript motor es basura. window.hasOwnProperty funciona en Chrome y Firefox y IE9.
    • usted obtendrá ningún desacuerdo aquí, pero todavía tengo que apoyar a la basura.
    • Matriz de índices han sido de primera clase de propiedades, al menos desde ES3. No tengo idea de si eso era nuevo o no en el momento, ya que es la primera versión realmente he estudiado. Así que todos los navegadores soportan for...in bucles en las matrices, pero aún no es una buena idea.

  5. 2

    Hay el «forEach» método de la Matriz de prototipo en los nuevos motores JavaScript. Algunas bibliotecas ampliar el prototipo de sí mismos con un método similar.

    • Por ejemplo: jQuery ha $.each.
    • sí, y el Prototipo añade «.cada» a la Matriz prototipo (o antes, de todos modos), y cosas por el estilo de Subrayado y Funcional también hacer cosas similares.
  6. 1
    x = [1,2,3];
    for (i in x) {
      console.log(i);
    }
    • Por favor, no hagas esto.
    • Esto no funcionará como se espera. En un for...in bucle, i es la clave (índice), no el valor. Usted necesita console.log(x[i]). También debe comprobar if(x.hasOwnProperty(x)) para asegurarse de que no estamos iterando sobre propiedades en el prototype.
  7. 1

    Probar este,

     var errorList = new Array();
           errorList.push("e1");
           errorList.push("e2");
    
           for (var indx in errorList){
                   alert(errorList[indx]);
              }

Dejar respuesta

Please enter your comment!
Please enter your name here