Ваш {...someFunction}
работает, потому что функции являются объектами, а ...
в литерале объекта предназначен для работы с объектами, а не с итерациями: он берет свои собственные перечисляемые свойства и помещает их в создаваемый объект. По умолчанию функции не имеют собственных перечислимых свойств, поэтому вы получите пустой объект, но если вы добавили свойство к функции, а затем использовали ...
в литерале объекта, это свойство будет скопировано в новый объект:
const someFunction = () => [1, 2, 3];
someFunction.myProperty = "foo";
const obj = {...someFunction};
console.log(obj.myProperty); // "foo"
console.log(Object.keys(obj)); // ["myProperty"]
...
означает разные вещи в разных контекстах. ...
в литерале массива отличается от ...
в литерале объекта. В литерале массива, как вы говорите, используется итерация для создания записей для массива, но это неверно в литерале объекта. ...
в литерале объекта - это свойство spread , добавленное в ES2018. Он вообще не полагается на итерацию; вместо этого он использует внутреннюю операцию под названием [[OwnPropertyKeys]] , чтобы найти ключи свойств для копирования из исходного объекта, а затем копирует их (это во внутренней операции CopyDataProperties ).