【问题标题】:Destructuring assignment in while loop in ES6 function doesn't propogate out of loop?ES6函数中while循环中的解构赋值不会传播到循环外?
【发布时间】:2017-02-06 10:52:57
【问题描述】:

我在 ES6 中(通过 node-esml)实现了一个简单的 GCD 算法,并且(对我来说)在 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 无济于事。我是否严重误解了解构分配的意义或遗漏了一些微妙的东西?还是bug?

【问题讨论】:

  • 您的 qtemp 变量是 implicitly global。使用严格模式!
  • 顺便说一句,你为什么不直接写function gcd(r, rdash) { 并省略let [r, rdash] = [x, y]

标签: javascript ecmascript-6 destructuring


【解决方案1】:

这不是解构赋值的问题,而是 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);),但由于您通常不使用分号,因此我假设您使用的是 npm coding style

【讨论】:

  • 恭喜您找到了丢失的分号,但为什么要将它添加到第二行的开头而不是像往常一样在第一行的末尾?
  • @Aaron 这是npm coding style
  • 谢谢,很高兴知道这一点。如果它们通常被省略并且问题是与前一行聚合,那么将分号放在有问题的行的开头确实是有意义的。
猜你喜欢
  • 2017-04-19
  • 1970-01-01
  • 2013-09-25
  • 2015-03-22
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2022-11-03
  • 2010-11-11
相关资源
最近更新 更多