Quelle est la bonne façon d'écrire une for-in
boucle en JavaScript? Le navigateur ne se plaint pas de l'une ou l'autre des deux approches que je montre ici. Tout d'abord, il y a cette approche où la variable d'itération x
est explicitement déclarée:
for (var x in set) {
...
}
Et alternativement cette approche qui se lit plus naturellement mais ne me semble pas correcte:
for (x in set) {
...
}
javascript
syntax
for-in-loop
futlib
la source
la source
var
n'a pas été utilisé pour déclarer la iteratori
:Uncaught ReferenceError: i is not defined
. Je vais donc l'utiliser à partir de maintenant: / webpack traite les variables "globales" bizarrement, pour en savoir plus, voir: stackoverflow.com/a/40416826Réponses:
Utilisez
var
, cela réduit la portée de la variable, sinon la variable recherche la fermeture la plus proche à la recherche d'unevar
instruction. S'il ne trouve pas de,var
alors il est global (si vous êtes dans un mode strictusing strict
, les variables globales génèrent une erreur). Cela peut entraîner des problèmes tels que les suivants.Si vous écrivez
var i
dans la boucle for, l'alerte s'affiche2
.Scoping et levage JavaScript
la source
var
intérieur de lafor
tête ressemble à un local dans la boucle for, ce qui n'est pas le cas. Par conséquent, je préfère le style de user422039 ci-dessous.La première version:
déclare une variable locale appelée
x
. La deuxième version:ne fait pas.
Si
x
est déjà une variable locale (c'est-à-dire que vous avez une variablevar x;
ouvar x = ...;
quelque part plus tôt dans votre portée actuelle (c'est-à-dire la fonction actuelle)) alors elles seront équivalentes. Si cex
n'est pas déjà une variable locale, l'utilisation de la seconde déclarera implicitement une variable globalex
. Considérez ce code:vous pouvez vous attendre à ce alerte
hey
,there
,heli
,hey
,there
,copter
, mais puisque lex
est une seule et même il alerterahey
,there
,there
,hey
,there
,there
. Tu ne veux pas ça! Utilisezvar x
dans vosfor
boucles.Pour couronner le tout: si la
for
boucle est dans la portée globale (c'est-à-dire pas dans une fonction), la portée locale (la portéex
est déclarée dans si vous utilisezvar x
) est la même que la portée globale (la portéex
est implicitement déclarée dans si vous utilisezx
sans var), les deux versions seront donc identiques.la source
Vous devriez vraiment déclarer les variables locales avec
var
, always .Vous ne devez pas non plus utiliser de boucles "for ... in", sauf si vous êtes absolument sûr que c'est ce que vous voulez faire. Pour parcourir des tableaux réels (ce qui est assez courant), vous devez toujours utiliser une boucle avec un index numérique:
Itérer dans un tableau simple avec "for ... in" peut avoir des conséquences inattendues, car votre boucle peut prendre des attributs du tableau en plus de ceux indexés numériquement.
edit - ici en 2015, il est également bon d'utiliser
.forEach()
pour itérer dans un tableau:La
.forEach()
méthode est présente sur le prototype Array à partir d'IE9.la source
En fait, si vous n'aimez pas la déclaration dans l'en-
for
tête, vous pouvez faire:Comme mentionné dans d'autres réponses à cette question, ne pas utiliser
var
du tout produit des effets secondaires inutiles comme l'attribution d'une propriété globale.la source
Utilisez celui avec lequel vous déclarez la variable de boucle
var
. Les variables déclarées implicitement ont une portée différente qui n'est probablement pas ce que vous vouliez.la source
est un modèle couramment observé mais différent de
en C ++ en ce que la variable n'est pas étendue au
for
bloc. En fait, levar
est hissé au sommet de la portée (fonction) englobante afin qu'un locali
soit effectivement disponible à la fois avant lafor
boucle (après le début de la portée / fonction actuelle) et après celle-ci.En d'autres termes, faire:
est le même que:
ES6 a le
let
mot - clé (au lieu devar
) pour limiter la portée au bloc for.Bien sûr, vous DEVRIEZ utiliser des variables locales (celles déclarées avec
var
oulet
ouconst
(dans ES6)) plutôt que des variables globales implicites.for(i=0; ...)
oufor(i in ...)
échouera si vous utilisez"use strict";
(comme vous devriez) eti
n'est pas déclaré.la source
L'utilisation
var
est la manière la plus propre, mais les deux fonctionnent comme décrit ici: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inFondamentalement, en utilisant,
var
vous vous assurez de créer une nouvelle variable. Sinon, vous pourriez utiliser accidentellement une variable précédemment définie.la source
Je pense que var est bon pour des raisons de performances.
Javascript ne regardera pas à travers toute la portée globale pour voir si x existe déjà ailleurs.
la source
D'un point de vue général, la première version sera pour un index qui doit vivre dans la portée de la boucle, tandis que l'autre serait n'importe quelle variable dans la portée où le constructeur de la boucle a été appelé.
Si vous allez utiliser l'index de la boucle à l'intérieur de la boucle for et que cela ne sera pas requis par les autres dans les lignes suivantes, mieux vaut déclarer la variable avec "var" pour être sûr que "x" est pour l'index de la boucle initialisé avec 0, tandis que l'autre, si une autre variable "x" est disponible dans ce contexte, elle sera écrasée par l'index de la boucle - c'est que vous aurez des erreurs logiques -.
la source