while for example array javascript for-loop

javascript - example - La variable en for loop es una cadena



let javascript (8)

Esta pregunta ya tiene una respuesta aquí:

No estoy seguro si esto es un comportamiento normal, pero al ejecutar esto:

for (var i in [1, 2, 3]) { console.log(i + 1); }

Resultados en esto:

// 01 // 11 // 21

¿Podría alguien explicar, por qué var i está siendo tratado como una cadena en esta situación y no si lo hago for (var i = 0; i < [1, 2, 3].length; i++) ?


Al usar la palabra clave in , está haciendo un bucle sobre cada tecla en el objeto y esos son tipos de cadena y cuando usa el operador + en una cadena, hará que realice una asignación de concatenación .

Si desea realizar una asignación aritmética, tanto el valor izquierdo como el derecho del operador deben ser de tipo entero . Una solución sería tratar de analizar la cadena a un número entero:

console.log(parseInt("0") + 1); // 1

Sin embargo...
En su lugar, deberías recorrer el valor :

var data = [1, 2, 3]; for(var key in data){ console.log(''a: data[''+ key + ''] = '' + data[key]); } for (var i = 0; i < data.length; i++) { console.log(''b: data[''+ i + ''] = '' + data[i]); } data.forEach(function(value, index){ console.log(''c: data['' + index + ''] = '' + value); });

Puede usar el método ES6 para recorrer el valor solo:

for(let v of [1, 2, 3]) { console.log(v); }

El inconveniente de este método es la incompatibilidad de los dispositivos Android más antiguos, ya que es un estándar algo nuevo.

Si está utilizando jQuery, también puede echar un vistazo a $.each ya que permite una clave, iteración de valor en un buen one-liner que es compatible con dispositivos más antiguos.

$.each([1, 2, 3], function(index, value) { console.log( index + ": " + value ); });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


Bueno, cuando usas el ciclo for...in , estás visitando cada tecla de un objeto. Las matrices son objetos y sus claves son números, pero generalmente las claves de objeto se tratan como cadenas.

Si desea convertir la clave a int, puede usar la función parseInt . link!


Creo que quieres los valores de la matriz, no las claves. Si no puedes usar ES6, la respuesta de Xorifelse funciona, pero si puedes, hay for ... of eso funciona exactamente como probablemente pensaste:

for (let i of [1, 2, 3]) { console.log(i + 1); }

También hay Array.prototype.forEach en ES5 y superior:

[1, 2, 3].forEach(function(value, index) { console.log(value + 1); });


Es más probable porque en este estilo de bucle (for..in), está tratando i como una clave, y dado que las claves en objetos son generalmente cadenas (sí, una matriz es un tipo de objeto en javascript), lo está tratando como una cadena.

parseInt(i) funciona en esta situación, pero para una buena práctica de programación, querrá usar un bucle for similar al siguiente:

var array = [1, 2, 3]; for (var i = array.length - 1; i >= 0; i--) { // do work with each array element here }


Es porque i una clave / índice de cada elemento y su tipo de cadena. Entonces, de hecho, estás concatenando string e int, el resultado es string.


Esto se debe a que con la palabra clave "in" recorre las claves del objeto, no los índices de matriz. Sin embargo, en este caso, dado que el objeto es una matriz, las claves de los elementos son índices. Y, por último, las teclas en un bucle for..in son cadenas.

Entonces, si necesita índices numéricos de una matriz, necesita usar un ciclo for para regular.

var array = [0, 1, 2]; for (var i = 0; i < array.length; i++) { console.log(i + 1); }


La razón es que for .. in itera las propiedades del objeto ("claves"), incluso para las matrices. Las "claves" en este caso son los "índices" de la matriz, pero siguen siendo solo claves de objeto. Como todas las teclas de objeto son cadenas, obtengo un valor de cadena.


for (var i in [1, 2, 3]) { console.log(parseInt(i) + parseInt(1)); }