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

Ste*_*ram 6 javascript destructuring ecmascript-6

我在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))
Run Code Online (Sandbox Code Playgroud)

回到了预期的答案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))
Run Code Online (Sandbox Code Playgroud)

它永远不会完成,进一步调试显示r将始终具有分配给的第一个值,x.看来这两个实现应该是一样的吗?请参阅交换变量

我也试过使用var而不是let无济于事.我是否彻底误解了解构任务的重点或遗漏了一些微妙的东西?或者这是一个错误?

Mic*_*ski 8

这不是解构分配的问题,而是ASI(自动分号插入).这两行:

q = Math.floor(rdash / r)
[r, rdash] = [rdash - q * r, r]
Run Code Online (Sandbox Code Playgroud)

在实践中意味着:

q = Math.floor(rdash / r)[r, rdash] = [rdash - q * r, r]
Run Code Online (Sandbox Code Playgroud)

这显然不是你的意思.要解决此问题,请在前面添加分号[:

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))
Run Code Online (Sandbox Code Playgroud)

当然你可以在前一行的末尾添加缺少的分号(q = Math.floor(rdash / r);),但由于你通常不使用分号,我假设你使用的是npm编码风格.

  • 恭喜,您找到了丢失的分号,但是为什么要像往常一样在第二行的开头而不是第一行的末尾添加它? (2认同)
  • @Aaron这是[npm编码风格](https://docs.npmjs.com/misc/coding-style#semicolons). (2认同)