[JavaScript] setTimeout(function(){}, 1) で 1 ミリ秒を指定しても同時刻になることがある

JavaScript の setTimeout(function(){}, 1) で 1 ミリ秒を指定してるのに、Date.now() の結果がたまに同時刻になることがあって困った話をご紹介します。

JavaScript

検証環境

Node.js (v6.11.5 LTS) REPL で、以下の3つの処理を同時に実行させて Date.now() の結果が全く同じになるのか確認しました。

console.log(Date.now())
setTimeout(function(){
  console.log(Date.now());
}, 1)
''

” については、setTimeout のオブジェクトが repl の標準出力に表示されないように実行しています。

setTimeout(function(){}, 1) で現在時刻が同じ or 違う

Date.now() の結果が同時刻になった場合

> console.log(Date.now()), setTimeout(function(){ console.log(Date.now()); }, 1), ''
1509078324903
''
> 1509078324903

Date.now() の結果が別時刻になった場合

> console.log(Date.now()), setTimeout(function(){ console.log(Date.now()); }, 1), ''
1509078326782
''
> 1509078326784

以上、setTimeout(function(){}, 1) で同時刻にハマった JavaScript の現場からお送りしました。