超小ネタです。JavaScriptのタイマー系関数にsetTimeout
とsetInterval
があります。これらは返り値として数値型のタイマー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行でもあるべきではないので知っておく価値はあると思います。