Réponse 2022
Si vous vous demandez "Est-ce que foo
est itérable" alors vous venez probablement d'un langage (PHP, Python) où cette question a une seule réponse. Dans le Javascript moderne, il existe différents types d'itérables. Par conséquent, vous devez vérifier la capacité à itérer en fonction de ce que vous voulez faire avec la variable.
TL;DR
- Testez la capacité à itérer en utilisant
forEach()
avec !!foo.forEach
, retourne true sur un Array.
- Testez la capacité à itérer en utilisant
for..of
avec !!foo[Symbol.iterator]
, retourne true sur un Array ou une chaîne de caractères.
- Testez la capacité à itérer en utilisant
for..in
avec !!Object.keys(Object(foo)).length
, retourne true sur un Array, une chaîne de caractères ou un Object.
Réponse longue
Définissons quelques variables :
const someNumber = 42;
42
const someArray = [1,2,3];
(3) [1, 2, 3]
const someString = "Hello";
"Hello, world!"
const someObject = {a:"A", b:"B"};
{a: "A", b: "B"}
Test de l'itérabilité avec forEach()
Quels types peuvent être itérés avec forEach()
, testés avec !!foo.forEach
:
someNumber.forEach(x=>console.log(x));
VM1526:1 Uncaught TypeError: someNumber.forEach n'est pas une fonction à :1:12
someArray.forEach(x=>console.log(x));
VM916:1 1
VM916:1 2
VM916:1 3
undefined
someString.forEach(x=>console.log(x));
VM957:1 Uncaught TypeError: someString.forEach n'est pas une fonction à :1:12
someObject.forEach(x=>console.log(x));
VM994:1 Uncaught TypeError: someObject.forEach n'est pas une fonction à :1:12
Seul le Array semble être itérable avec forEach()
.
Test de l'itérabilité avec for..of
Quels types peuvent être itérés avec for..of
, testés avec !!foo[Symbol.iterator]
:
for (x of someNumber) { console.log(x); }
VM21027:1 Uncaught TypeError: someNumber n'est pas itérable à :1:11
for (x of someArray) { console.log(x); }
VM21047:1 1
VM21047:1 2
VM21047:1 3
undefined
for (x of someString) { console.log(x); }
VM21065:1 H
VM21065:1 e
VM21065:1 l
VM21065:1 l
VM21065:1 o
undefined
for (x of someObject) { console.log(x); }
VM21085:1 Uncaught TypeError: someObject n'est pas itérable à :1:11
Le Array et la chaîne de caractères semblent être itérables avec for..of, mais pas l'Object. Et à la fois le Nombre et l'Object ont généré une erreur.
Test de l'itérabilité avec for..in
Quels types peuvent être itérés avec for..in
, testés avec !!Object.keys(Object(foo)).length
:
for (x in someNumber) { console.log(x); }
undefined
for (x in someArray) { console.log(x); }
VM20918:1 0
VM20918:1 1
VM20918:1 2
undefined
for (x in someString) { console.log(x); }
VM20945:1 0
VM20945:1 1
VM20945:1 2
VM20945:1 3
VM20945:1 4
undefined
for (x in someObject) { console.log(x); }
VM20972:1 a
VM20972:1 b
undefined
Le Array, la chaîne de caractères et l'Object semblent tous être itérables avec for..in
. Et bien qu'il n'ait pas itéré, le Nombre n'a pas généré d'erreur.
Dans le Javascript moderne, ES6, je vois forEach
utilisé beaucoup plus souvent que for..in
ou for..of
. Mais les développeurs Javascript doivent être conscients des différences entre les trois approches, et du comportement différent de chaque approche.