定数は再代入できないのに、d.setDate(31); で 2019/12/01 10:20:30 となるのが理解できません

再代入しているのではなく、元のオブジェクトそのものを変更しています。
2020年6月7日
ユーザー
const d = new Date(2019, 10);

のあと

d.setHours(10, 20, 30);

で、2019/11/01 10:20:30 になるところまでは理解できましたが、
その後さらに、

d.setDate(31);

2019/12/01 10:20:30 となったり、

d.setDate(d.getDate() + 3); 

2019/12/04 10:20:30
になるところが理解できません。

私の解釈では、

'use strict';

{
  const d = new Date(2019, 10); // 2019/11/01 00:00:00
  d.setHours(10, 20, 30); // 2019/11/01 10:20:30
  d.setDate(31); // 2019/12/01 00:00:00
  d.setDate(d.getDate() + 3); // 2019/11/04 00:00:00
  console.log(d); // 2019/11/01 00:00:00
}

このように考えてしまいます。

この回答を見るにはプレミアムプランへの登録が必要です

プレミアムプランとは?

このレッスンの質問と回答(7)