41
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【JavaScript】setTimeoutから返るIDは絶対0じゃないし、clearTimeoutに0を渡しても何もしない

Posted at

超小ネタです。JavaScriptのタイマー系関数にsetTimeoutsetIntervalがあります。これらは返り値として数値型のタイマーIDを返し、このタイマーIDをclearTimeout及びclearIntervalに渡すことでタイマーをキャンセルできます。

このタイマーIDは0よりも大きいことが保証されています。またclearTimeoutまたはclearIntervalに無効なタイマーIDを渡しても何もしないことも保証されています。(以下参照)

なのでタイマーを使っていないときはタイマーIDに0を代入しておけば、clearTimeoutを使うときに毎回タイマーを起動しているかをチェックするようなコードは不要です。

このようなコードは基本的に不要
if(timerId != null) {
  clearTimeout(timerId);
}

この事実は例えばsetTimeoutの用途として頻出するスロットリングをするときのコードをちょっとだけ短くできます。

-let timerId = null;
+let timerId = 0;
 function onInput(text) {
-  if(timerId != null) {
-    clearTimeout(timerId);
-  }
+  clearTimeout(timerId);
   timerId = setTimeout(async () => {
     await sendRequest(text);
   }, 500);
 }

ちなみにTypeScriptの場合は、型注釈が不要になるというメリットが追加であります。

-let timerId: number | null = null;
+let timerId = 0;
 function onInput(text) {
-  if(timerId != null) {
-    clearTimeout(timerId);
-  }
+  clearTimeout(timerId);
   timerId = setTimeout(async () => {
     await sendRequest(text);
   }, 500);
 }

微々たる差ですが条件分岐はなるべく少ないほうが良いですし、無意味な処理をするコードは1行でもあるべきではないので知っておく価値はあると思います。

41
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?