function func1 () {

  return Array(3).fill({}).map((item, index) => {

    return Object.assign(item, {index: index});
  });
};

私はこのfunctionの返り値が以下のようになるのを期待していました。

console.log( func1() ); // [ { index: 0 }, { index: 1 }, { index: 2 } ]

しかし実際は以下のような結果になりました。

console.log( func1() ); // [ { index: 2 }, { index: 2 }, { index: 2 } ]

これはObject.assign()の評価のタイミングの問題なのでしょうか?
このことについて詳しく説明できる方がいれば教えていただきたいです。

ちなみに以下のようにObject.assignの評価を強制的にmap内で済ませることで期待する結果を返すことはできました。

function func2 () {

  return Array(3).fill({}).map((item, index) => {

    return JSON.parse(JSON.stringify(Object.assign(item, {index: index})));
  });
}

console.log( func2() ) // [ { index: 0 }, { index: 1 }, { index: 2 } ]