2.1.16 [ECMA-ES2017] Section 13.7.5.12 Runtime Semantics: ForIn/OfHeadEvaluation ( TDZnames, expr, iterationKind )

V0208: ForIn/OfHeadEvaluation does not return an AbruptCompletion when exprValue.[[value]] is null or undefined

The specification states:

 13.7.5.12 Runtime Semantics: ForIn/OfHeadEvaluation ( TDZnames, expr, iterationKind)
  
     The abstract operation ForIn/OfHeadEvaluation is called with arguments TDZnames, 
     expr, and iterationKind. The value of iterationKind is either enumerate, iterate, or 
     async-iterate [prior to 2018, "enumerate or iterate"].
         ...
         6.  If iterationKind is enumerate, then
             a. If exprValue [prior to 2018, "exprValue.[[value]]"] is undefined or null, 
             then
                i.   Return Completion{[[type]]: break, [[value]]: empty, [[target]]: 
                empty}.
             b. Let obj be ! ToObject(exprValue).
             c. Return ? EnumerateObjectProperties(obj).
         7.  Else,
             a.  Assert: iterationKind is iterate.
             ...
             ... Return ? GetIterator(exprValue, ...).

EdgeHTML Mode

Logic in the If branch is also executed in the Else branch:

    7.  Else,

        -. If  exprValue [prior to 2018, "exprValue.[[value]]"] is undefined or null, then

           i.   Return Completion{[[type]]: break, [[value]]: empty, [[target]]: empty}.

        a.  Assert: iterationKind is iterate.

        ... Return ? GetIterator(exprValue).

Therefore ForIn/OfHeadEvaluation does not return an abrupt completion for iterationKind is iterate when exprValue {prior to 2018, exprvalue.[[value]] is null or undefined. For example, the following statements do not throw errors:

    for (let x of null) {}

    for (let x of undefined) {}