在ES6函数中while循环中的解构赋值不会传播出循环?

时间:2016-09-28 12:40:00

标签: javascript ecmascript-6 destructuring

我在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无济于事。我是否彻底误解了解构任务的重点或遗漏了一些微妙的东西?或者这是一个错误?

1 个答案:

答案 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}}