• JavaScript
  • JavaScript
  • Tutorials and guides
  • Beginner's tutorials
    1. JavaScript Guide
      1. Loops and iteration
      2. Representing dates & times
      3. Working with objects
      4. Iterators and generators
      5. Asynchronous JavaScript
      6. Equality comparisons and sameness
      7. Meta programming
      8. AggregateError
      9. AsyncGenerator
      10. BigInt
      11. DataView
      12. encodeURI()
      13. escape() Deprecated
      14. Float16Array
      15. Generator
      16. Int8Array
      17. InternalError Non-standard
      18. Iterator
      19. NaN
      20. parseInt()
      21. ReferenceError
      22. SharedArrayBuffer
      23. Temporal Experimental
      24. Uint8ClampedArray
      25. unescape() Deprecated
      26. WeakSet
  • Assignment (=)
  • Bitwise AND (&)
  • Bitwise OR assignment (|=)
  • Comma operator (,)
  • Destructuring
  • Exponentiation (**)
  • Greater than (>)
  • import.meta.resolve()
  • Inequality (!=)
  • Less than (<)
  • Logical NOT (!)
  • Multiplication assignment (*=)
  • Nullish coalescing assignment (??=)
  • Optional chaining (?.)
  • Right shift (>>)
  • Strict inequality (!==)
  • this
  • Unsigned right shift (>>>)
  • yield*
  • Block statement
  • continue
  • export
  • for...in
  • if...else
  • let
  • try...catch
  • with Deprecated
  • get
  • The arguments object
    1. callee Deprecated
    2. extends
    3. Static initialization blocks
  • Character class escape: \d, \D, \w, \W, \s, \S
  • Input boundary assertion: ^, $
  • Modifier: (?ims-ims:...)
  • Quantifier: *, +, ?, {n}, {n,}, {n,m}
  • Errors
    1. RangeError: argument is not a valid code point
    2. RangeError: invalid array length
    3. RangeError: repeat count must be less than infinity
    4. ReferenceError: assignment to undeclared variable "x"
    5. SyntaxError: 'arguments'/'eval' can't be defined or assigned to in strict mode code
    6. SyntaxError: \ at end of pattern
    7. SyntaxError: await is only valid in async functions, async generators and modules
    8. SyntaxError: continue must be inside loop
    9. SyntaxError: function statement requires a name
    10. SyntaxError: identifier starts immediately after numeric literal
    11. SyntaxError: invalid assignment left-hand side
    12. SyntaxError: invalid class set operation in regular expression
    13. SyntaxError: invalid property name in regular expression
    14. SyntaxError: invalid unicode escape in regular expression
    15. SyntaxError: missing ) after argument list
    16. SyntaxError: missing } after property list
    17. SyntaxError: missing variable name
    18. SyntaxError: numbers out of order in {} quantifier.
    19. SyntaxError: property name __proto__ appears more than once in object literal
    20. SyntaxError: rest parameter may not have a default
    21. SyntaxError: super() is only valid in derived class constructors
    22. SyntaxError: unlabeled break must be inside loop or switch
    23. TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed
    24. TypeError: "x" is not a function
    25. TypeError: BigInt value can't be serialized in JSON
    26. TypeError: can't convert BigInt to number
    27. TypeError: can't redefine non-configurable property "x"
    28. TypeError: class constructors must be invoked with 'new'
    29. TypeError: Initializing an object twice is an error with private fields/methods
    30. TypeError: Iterator/AsyncIterator constructor can't be used directly
    31. TypeError: property "x" is non-configurable and can't be deleted
    32. TypeError: X.prototype.y called on incompatible type
    33. JavaScript technologies overview
    34. Strict mode
    35. Learn more
    36. See full compatibility
  • The while statement creates a loop that executes a specified statement as long as the test condition evaluates to true. The condition is evaluated before executing the statement.

    Try it

    let n = 0;
    
    while (n < 3) {
      n++;
    }
    
    console.log(n);
    / Expected output: 3
    

    Syntax

    js
    while (condition)
      statement
    
    condition

    An expression evaluated before each pass through the loop. If this condition evaluates to false, execution continues with the statement after the while loop.

    statement

    A statement that is executed as long as the condition evaluates to true. You can use a block statement to execute multiple statements.

    Description

    Like other looping statements, you can use control flow statements inside statement:

    • break stops statement execution and goes to the first statement after the loop.
    • continue stops statement execution and re-evaluates condition.

    Examples

    Using while

    The following while loop iterates as long as n is less than three.

    js
    let n = 0;
    let x = 0;
    
    while (n < 3) {
      n++;
      x += n;
    }
    

    Each iteration, the loop increments n and adds it to x. Therefore, x and n take on the following values:

    • After the first pass: n = 1 and x = 1
    • After the second pass: n = 2 and x = 3
    • After the third pass: n = 3 and x = 6

    After completing the third pass, the condition n < 3 is no longer true, so the loop terminates.

    Using an assignment as a condition

    In some cases, it can make sense to use an assignment as a condition. This comes with readability tradeoffs, so there are certain stylistic recommendations that would make the pattern more obvious for everyone.

    Consider the following example, which iterates over a document's comments, logging them to the console.

    js
    const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
    let currentNode;
    while (currentNode = iterator.nextNode()) {
      console.log(currentNode.textContent.trim());
    }
    

    That's not completely a good-practice example, due to the following line specifically:

    js
    while (currentNode = iterator.nextNode()) {
    

    The effect of that line is fine — in that, each time a comment node is found:

    1. iterator.nextNode() returns that comment node, which gets assigned to currentNode.
    2. The value of currentNode = iterator.nextNode() is therefore truthy.
    3. So the console.log() call executes and the loop continues.

    …and then, when there are no more comment nodes in the document:

    1. iterator.nextNode() returns null.
    2. The value of currentNode = iterator.nextNode() is therefore also null, which is falsy.
    3. So the loop ends.

    The problem with this line is: conditions typically use assignment operator. So that = looks like it's a typo for === — even though it's not actually a typo.

    Therefore, in cases like that one, some code-linting tools such as ESLint's no-cond-assign rule — in order to help you catch a possible typo so that you can fix it — will report a warning such as the following:

    Expected a conditional expression and instead saw an assignment.

    Many style guides recommend more explicitly indicating the intention for the condition to be an assignment. You can do that minimally by putting additional parentheses as a grouping operator around the assignment:

    js
    const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
    let currentNode;
    while ((currentNode = iterator.nextNode())) {
      console.log(currentNode.textContent.trim());
    }
    

    In fact, this is the style enforced by ESLint's no-cond-assign's default configuration, as well as Prettier, so you'll likely see this pattern a lot in the wild.

    Some people may further recommend adding a comparison operator to turn the condition into an explicit comparison:

    js
    while ((currentNode = iterator.nextNode()) !== null) {
    

    There are other ways to write this pattern, such as:

    js
    while ((currentNode = iterator.nextNode()) && currentNode) {
    

    Or, forgoing the idea of using a while loop altogether:

    js
    const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
    for (
      let currentNode = iterator.nextNode();
      currentNode;
      currentNode = iterator.nextNode()
    ) {
      console.log(currentNode.textContent.trim());
    }
    

    If the reader is sufficiently familiar with the assignment as condition pattern, all these variations should have equivalent readability. Otherwise, the last form is probably the most readable, albeit the most verbose.

    Specifications

    Specification
    ECMAScript® 2026 Language Specification
    # sec-while-statement

    Browser compatibility

    See also