33 votes

Variable dans la boucle for est une chaîne de caractères

Je ne sais pas si ce comportement est normal, mais l'exécution de cette:

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

Les résultats de cette:

// 01
// 11
// 21

Quelqu'un pourrait expliquer, pourquoi est - var i d'être traité comme une chaîne de caractères dans cette situation et ne pas si je dois for (var i = 0; i < [1, 2, 3].length; i++)?

38voto

Derek Pollard Points 3540

Ses plus probable que dans cette boucle de style (pour..), il est le traitement de l' i comme une clé, et depuis les touches dans les objets sont généralement des chaînes (oui, un tableau est un type d'objet en javascript), c'est la traiter comme une Chaîne de caractères.

parseInt(i) travaille dans cette situation, mais pour une bonne programmation de la pratique, vous souhaitez utiliser un for boucle qui ressemble à ceci:

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

18voto

Amit Points 1

La raison en est qu' for .. in itère les propriétés de l'objet (les"clés"), même pour les tableaux. Les "touches" dans ce cas sont les "indices" de la matrice, mais il est encore juste clés de l'objet. Comme tous les objets clés sont des chaînes de caractères, i obtient une valeur de chaîne.

12voto

D_4_ni Points 852

Je pense que vous voulez les valeurs de la matrice, pas les clés. Si vous ne pouvez pas utiliser ES6, Xorifelse la réponse de travaux, mais si vous le pouvez, n'est - for ... of qui fonctionne exactement comme vous l'avez probablement pensé:

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

Il est également Array.prototype.forEach dans l'ES5 et jusqu':

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

10voto

Xorifelse Points 1726

À l'aide de l' in mot-clé boucle sur chaque clé dans l'objet et ceux qui sont de la chaîne de types et lors de l'utilisation de l' + de l'opérateur sur une chaîne va l'amener à faire une concaténation d'affectation.

Si vous souhaitez effectuer une arithmétique affectation à la fois la gauche et la droite la valeur de l'opérateur doivent être un entier de type. Une solution serait d'essayer d'analyser la chaîne en nombre entier:

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

Cependant...
Vous devriez être en boucle sur la valeur à la place:

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);
});

Vous pouvez utiliser l' ES6 méthode pour passer en boucle sur la valeur seul:

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

L'inconvénient de cette méthode est l'incompatibilité des anciens appareils android depuis sa un peu de la nouvelle norme.


Si vous utilisez jQuery, vous pouvez aussi jeter un oeil à $.chaque car elle permet une clé, valeur d'itération dans un joli one-liner qui est compatible avec les anciens appareils.

$.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>

5voto

dzej.5 Points 361

C'est parce qu' i est une clé/ indice de chaque élément, et il est de type chaîne. Vous êtes donc en fait la concaténation de string et int – le résultat est une chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X