JavaScript treats asynchronous values and iterable behavior as separate until used with for-await-of loop, where they come together.An object is iterable when it has a method tied to Symbol.iterator that returns an object with a .next() method.Async iterators are similar, but the .next() method returns a Promise, making the loop wait for Promise resolution.for-await-of loop uses Symbol.asyncIterator to handle Promises and values with done flags.Async generators combine yielding values like regular generators with waiting on Promises, allowing for pausing and waiting during execution.The for-await-of loop waits for each yield from an async generator, allowing values to be processed as they arrive.JavaScript engine turns async generators into paused state machines, enabling natural pause and resume functionality without manual handling.Code within the for-await-of loop is paused using microtasks while waiting for Promises, ensuring asynchronous loops remain responsive.for-await-of loop throws exceptions for rejected Promises, and the entire loop structure should be inside a try block to catch errors.If a loop exits early, the engine checks for a .return() method in the iterator to clean up resources before finishing.