为什么 Javascript 对带大括号和不带大括号的 while 循环的看法不同?没有大括号的 while 循环可以嵌套吗?

Why does Javascript view while loops with and without curly braces differently? Can while loops without curly braces be nested?

提问人:eatthischair 提问时间:5/27/2023 最后编辑:blakkwatereatthischair 更新时间:5/28/2023 访问量:48

问:

我正在研究一个问题,以确定链表是否是回文(Leetcode 234)。我遇到了这个(远远高于我的水平)解决方案。

var isPalindrome = function(head) {
    let slow = head, fast = head, prev, temp

    while (fast && fast.next)
        slow = slow.next, fast = fast.next.next
    prev = slow, slow = slow.next, prev.next = null

    while (slow)
        temp = slow.next, slow.next = prev, prev = slow, slow = temp
    fast = head, slow = prev

    while (slow) {
        if (fast.val !== slow.val) return false
        else fast = fast.next, slow = slow.next
    } //i added these curly braces because the solution still works with them
    return true
};

我对缺少大括号感到困惑,所以我添加了它们以查看循环是否嵌套。

但是,当我将大括号添加到第二个 while 循环时,代码会超时,如果我将它们添加到第一个 while 循环中,某些测试用例会失败。

var isPalindrome = function(head) {
    let slow = head, fast = head, prev, temp
    while (fast && fast.next) {
        slow = slow.next, fast = fast.next.next
    prev = slow, slow = slow.next, prev.next = null
    }
    while (slow) {
        temp = slow.next, slow.next = prev, prev = slow, slow = temp
    fast = head, slow = prev;
    }
    while (slow) {
        if (fast.val !== slow.val) return false
        else fast = fast.next, slow = slow.next
      }
    return true
};

我还尝试将第三个 while 循环嵌套在第二个循环中,如下所示,

var isPalindrome = function(head) {
    let slow = head, fast = head, prev, temp
    while (fast && fast.next) {
        slow = slow.next, fast = fast.next.next
    prev = slow, slow = slow.next, prev.next = null
    }
    while (slow) {
        temp = slow.next, slow.next = prev, prev = slow, slow = temp
    fast = head, slow = prev;
    while (slow) {
        if (fast.val !== slow.val) return false
        else fast = fast.next, slow = slow.next
      }
    }
    return true
};

它仍然没有运行。我已经尝试了所有可能的嵌套变体,但没有运气,我什至不知道该谷歌做什么才能理解。

我在这里错过了什么?我很困惑

任何帮助将不胜感激。谢谢大家

JavaScript while 循环 语法 嵌套 大括号

评论

1赞 Sebastian Simon 5/27/2023
while 循环的语法是 Expression 语句 — 参见 MDN规范该语句是 。为什么你认为也会成为声明的一部分?请参阅 JavaScript 中的单行语句中是否需要大括号?while()temp = slow.next, slow.next = prev, prev = slow, slow = tempfast = head, slow = prev
0赞 eatthischair 5/28/2023
@SebastianSimon以前从未见过这样的代码,以为语句会以分号结尾,而不仅仅是换行符。但感谢您的澄清:)

答:

0赞 traktor 5/27/2023 #1

您找到的代码根本不是“高于您的水平”。相反,它是如此糟糕,以至于如果有人发现它令人困惑,我并不感到惊讶,更不用说初学者了。可悲的是,原始代码使用的技巧是使用逗号运算符将多个语句转换为单个内联语句,以避免键入大括号,并省略分号终止符以节省空间。

以下是维护程序员如何机械地编写它

  • 将逗号运算符语句替换为块语句,
  • 插入语句终止符,
  • 移动到唯一使用它的块,以及temp
  • 不要在条件语句后放置“else”关键字:return
var isPalindrome = function(head) {
    let slow = head, fast = head, prev;

    while (fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
    }
    prev = slow;
    slow = slow.next;
    prev.next = null;
    while (slow) {
        let temp = slow.next;
        slow.next = prev;
        prev = slow;
        slow = temp;
    }
    fast = head;
    slow = prev;
    while (slow) {
        if (fast.val !== slow.val) {
            return false;
        }
        fast = fast.next;
        slow = slow.next;
    }
    return true;
};

我不是在评论代码是否有效,而是以这种方式编写,插入大括号以确定是否嵌套了任何 while 循环是不必要的


标题问题

  1. 为什么 JavaScript 查看带大括号和不带大括号的循环不同?它没有做出这样的区分。编译器在 之后查找语句,大括号和其中的代码被解析为单个块语句。whilewhile

  2. 没有大括号的循环可以嵌套吗?是的,但通常不(如“从不”)作为紧跟在外部之后的内联语句:whilewhile

     while(condition1) while(condition2){ code }
    

评论

0赞 eatthischair 5/28/2023
谢谢你,这就是我被教导写代码的方式。评论中的每个人都在称赞他们,我不明白发生了什么!哈哈