Diferença entre Object.assign e Spread operator?


Qual a diferença detalhada de se usar Object.assign e o ES6 operador ...?

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

console.log(Object.assign(target, source));

console.log({ ...target, ...source });