省略分号时出错 - 有人可以解释为什么吗?

Error in omitting semicolon - can someone explain why?

有人可以解释为什么我在 while(nums[right-1] == nums[right--]); 行中省略分号会出现语法错误吗?我大致理解分号的意义,但为什么是这一行而不是其他行?

var threeSum = function(nums) {
    nums.sort((a,b)=>a-b);
    let result = [];
    for (let i=0;i<nums.length;i++) {
        let t = -nums[i];
        let left = i+1, right = nums.length-1;
        while(left < right) {
            if (nums[left] + nums[right] == t) {
                result.push([nums[i], nums[left], nums[right]]);
                while(nums[left+1] == nums[left++]);
                while(nums[right-1] == nums[right--]);
            } else if (nums[left]+nums[right] < t) left++;
            else right--;
        }
        while(nums[i+1]==nums[i]) i++
    }

    return result;

};

一个循环需要一些东西来循环。基本上是一个语句或一个代码块。例如:

while (something) {
  this.isInACodeBlock();
}

或:

while (something)
  this.isAStatement();

请记住,语句 可能是空操作。分号本身就是为了这个目的。由于回车 returns 对语言无关紧要,因此这是一个带有语句的循环:

while (something);

更进一步,这个循环一个代码块内,在循环之后结束:

if (somethingElse) {
  while (something)
}

如果在 while 循环之后只有一个语句,那么它在语法上是正确的,即使行为是意外的或错误。但是有一个右花括号。

所以解释器期待一个语句或一个开始块,但它遇到了一个结束块。这是一个错误。

来自@David 的很好的解释,我将补充一点,为避免此类错误,您应该考虑遵循像 airbnb 这样的样式指南。让您的代码更易于阅读。

实现方法:将 ++ 替换为 +=。注释代码的主要部分...等等

好的代码是你读懂的代码。我应该已经理解 threeSums 函数在做什么以及为什么你要执行这些 while 只是通过查看它。

// the function do blabla
function threeSums(nums) {
  nums.sort((a, b) => a - b);

  const result = [];

  for (let i = 0; i < nums.length; i += 1) {
    // what is t?
    const t = -nums[i];

    let left = i + 1;
    let right = nums.length - 1;

    while (left < right) {
      // what is the case covered by this if?
      if (nums[left] + nums[right] == t) {
        result.push([
           nums[i],
           nums[left],
           nums[right],
        ]);

        while (nums[left + 1] == nums[left]) {
          left += 1;
        }

        while (nums[right - 1] == nums[right]) {
          right -= 1
        }
      } else if (nums[left] + nums[right] < t) {
        left += 1;
      } else {
        right -= 1;
      }
    }

    while (nums[i + 1] == nums[i]) {
      i += 1;
    }
  }

  return result;
};