我在ES6中实现了一个简单的GCD算法(通过node-esml),并且在一个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
无济于事。我是否彻底误解了解构任务的重点或遗漏了一些微妙的东西?或者这是一个错误?
答案 0 :(得分:8)
这不是解构分配的问题,而是ASI(自动分号插入)。这两行:
q = Math.floor(rdash / r)
[r, rdash] = [rdash - q * r, r]
在实践中意味着:
q = Math.floor(rdash / r)[r, rdash] = [rdash - q * r, r]
这显然不是你的意思。要解决此问题,请在[
前面添加分号:
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))

当然,您可以在上一行的末尾添加缺少的分号(q = Math.floor(rdash / r);
),但由于您通常不使用分号,我认为您正在使用{{ 3}}