当我简单地改变两个表达式的顺序时,为什么这个for循环不起作用

Yan*_* Li 2 javascript syntax

对于以下fibonacci函数,它按预期工作:

function fibonacci(n) {
  var nums = []
  var a = b = 1
  for (let i = 0; i < n; i++) {
    [a, b] = [b, a + b]
    nums.push(a)
  }
  return nums
}

console.log(fibonacci(5));
// outputs: [1,2,3,5,8]
Run Code Online (Sandbox Code Playgroud)

但在我更改了两个语句的顺序后,它不起作用:

function fibonacci(n) {
  var nums = []
  var a = b = 1
  for (let i = 0; i < n; i++) {
    nums.push(a)
    [a, b] = [b, a + b]
  }
  return nums
}

console.log(fibonacci(5));
// outputs: [1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)

它出什么问题了?

Bar*_*mar 5

这是因为你在行的末尾遗漏了分号

nums.push(a)
Run Code Online (Sandbox Code Playgroud)

所以它将两条线合并为:

nums.push(a)[a, b] = [b, a + b]
Run Code Online (Sandbox Code Playgroud)

这不会重新分配ab变量,它是索引数组.

你应该摆脱省略分号的坏习惯.Javascript允许它,但正如您在此示例中看到的那样,并不总是推断语句会在您认为它们出现的地方中断.

function fibonacci(n) {
  var nums = [];
  var a = b = 1;
  for (let i = 0; i < n; i++) {
    nums.push(a);
    [a, b] = [b, a + b];
  }
  return nums;
}

console.log(fibonacci(5));
// outputs: [1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)