Je mettais en œuvre un algorithme GCD simple dans ES6 (via node-esml) et suis arrivé (à moi) un comportement étrange avec la mise à jour des valeurs de variables dans une boucle while. Ce code fonctionne fantastiquement:L'affectation de la déstructuration dans la boucle while de la fonction ES6 ne se produit pas en boucle?
function gcdWithTemp(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash/r)
temp = r
r = rdash - q * r
rdash = temp
}
return(rdash)
}
console.log(gcdWithTemp(97, 34))
Renvoyer la réponse attendue de 1
. Cependant, si je retire la variable temporaire et utilisez plutôt l'affectation déstructurant pour essayer d'atteindre les mêmes résultats:
function gcdWithDestructuredAssignment(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash/r)
[r, rdash] = [rdash - q * r, r]
}
return(rdash)
}
console.log(gcdWithDestructuredAssignment(97, 34))
Il ne se termine jamais, plus débogage montre que r aura toujours la première valeur attribuée à, x
. Il semble que ces deux implémentations devraient être identiques? J'ai également essayé avec var
au lieu de let
en vain. Suis-je en train de mal comprendre le point de la déstructuration ou de manquer quelque chose de subtil? Ou est-ce un bug?
Vos variables 'q' et' temp' sont [implicitement globales] (http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html). Utilisez le mode strict! – Bergi
Btw, pourquoi ne pas simplement écrire 'la fonction gcd (r, rdash) {' et omettre le 'let [r, rdash] = [x, y]'? – Bergi