我在ES6中实现了一个简单的GCD算法(通过node-esml),并且在更新while循环中的变量值时遇到了(对我来说)奇怪的行为。此代码非常有效:ES6函数中的while循环中的解构赋值不会传播出循环吗?
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))
返回预期的答案1
。但是,如果我删除临时变量,而使用解构赋值,试图获得相同的结果:
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))
它从来没有完成,进一步调试表明,R将始终有一个分配给,x
第一个值。看来这两个实现应该是相同的?看到Swapping variables
我也试过用var
而不是let
无济于事。我是否彻底误解了解构任务或错失了某种微妙的东西?或者它是一个错误?
你的'q'和'temp'变量是[隐含的全局](http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html)。使用严格模式! – Bergi
顺便说一句,你为什么不写'函数gcd(r,rdash){'并省略'let [r,rdash] = [x,y]'? – Bergi