Difundir indefinido en matriz vs object

¿Por qué la dispersión indefinida en un object devuelve un object vacío? {...undefined} // equals {} :

 console.log({...undefined}) 

¿Y por qué la dispersión indefinida en una matriz le da un error? [...undefined] // type error :

 console.log([...undefined]) 

Como se señala en los comentarios, y se resume en @ftor desde # 687 , la dispersión de objects es equivalente a Object.assign () (numbers # 687 , # 45 ), donde la extensión en el context literal de la matriz es extensible.

Citando Ecma-262 6.0 , Object.assign () se define como:

19.1.2.1 Object.assign (target, … fonts)

La function de asignación se usa para copyr los valores de todas las properties enumerables de uno o más objects de origen a un object de destino. Cuando se llama a la function de asignación , se realizan los siguientes pasos:

  1. Dejado para ser ToObject (objective).
  2. ReturnIfAbrupt (a).
  3. Si solo se aprobó un argumento, regrese a.
  4. Deje que las fonts sean la Lista de valores de argumento que comienza con el segundo argumento.
  5. Para cada elemento nextSource de fonts, en order de índice ascendente, hacer
    1. Si nextSource no está definido o es nulo , deje que las keys sean una list vacía.
    2. De lo contrario, …

… seguido de la descripción de copyr properties propias. El borrador de Object Rest / Spread Properties está aquí . No es parte del Ecma-262 6.0.

Un SpreadElement en una expresión literal de matriz se define para comenzar de la siguiente manera:

SpreadElement : AssignmentExpression

  1. Deje que spreadRef sea ​​el resultado de evaluar AssignmentExpression .
  2. Deje spreadObj ser GetValue ( spreadRef ).
  3. Deje iterator ser GetIterator ( spreadObj ).
  4. ReturnIfAbrupt (iterador).

Y dado que undefined no tiene una propiedad con la key @@ iterator , se lanza un TypeError , basado en los pasos de GetIterator . El estándar no es una lectura fácil, pero si no me equivoco, la ruta al error es GetIterator -> GetMethod -> GetV -> ToObject , que arroja un TypeError para undefined y null.

Un remedio simple para usar variables con un valor posiblemente indefinido en la initialization de la matriz es usar un valor pnetworkingeterminado:

 const maybeArray = undefined; const newArray = [ ...(maybeArray || []) ];