FirefoxとChromeで異なるDateとRegExpの違い

FirefoxとChromeでDateとRegExpの扱いが若干異なることで嵌ったのでメモ。

Date

FirefoxではDateをnewする際にDateをそのまま渡すと同じ値にならない。Chromeでは想定した通り同じ値になる。

Firefox

var date = new Date;

+date;
// 1420909365967

+new Date(date);
// 1420909365000
// 異なる値になっている

+new Date(+date);
// 1420909365967
// 同じ値になっている

Chrome

var date = new Date;

+date;
// 1420909757913

+new Date(date);
// 1420909757913
// 同じ値になっている

+new Date(+date);
// 1420909757913
// 同じ値になっている

RegExp

FirefoxとChromeでsourceの値が異なる場合がある。

Firefox

(new RegExp).source;
// ""

Chrome

(new RegExp).source;
// "(?:)"

ちなみに、Stringでキャストするとどちらも同じ値になる。

String(new RegExp);
// "/(?:)/"

どちらもECMA-262の仕様通りなんだろうか……