みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

JavaScript の Number.isFinite() と isFinite() の違い

JavaScript で isFinite(null)true と評価されることに気づいて軽く絶望しました.以下のようにユニットテストを作成して確認しました.

package.json

{
  "name": "isfinite",
  "version": "1.0.0",
  "scripts": {
    "test": "vitest"
  },
  "devDependencies": {
    "vitest": "^0.32.4"
  }
}

test.spec.ts

import { assert, describe, it } from "vitest";

describe("Number.isFinite() true", () => {
    const list: any[] = [0, 1, 2, 1024, -4];
    for (const v of list) {
        it("v=" + v, () => {
            assert.isTrue(Number.isFinite(v));
        });
    }
});

describe("Number.isFinite() false", () => {
    const list: any[] = [undefined, null, Infinity, NaN, -Infinity, "0", "string", true, false];
    for (const v of list) {
        it("v=" + v, () => {
            assert.isFalse(Number.isFinite(v));
        });
    }
});

describe("isFinite() true", () => {
    const list: any[] = [0, 1, 2, 1024, -4, null, "0", true, false];
    for (const v of list) {
        it("v=" + v, () => {
            assert.isTrue(isFinite(v));
        });
    }
});

describe("isFinite() false", () => {
    const list: any[] = [undefined, Infinity, NaN, -Infinity, "string"];
    for (const v of list) {
        it("v=" + v, () => {
            assert.isFalse(isFinite(v));
        });
    }
});

実行したところ全て合格しました.

 Test Files  1 passed (1)
      Tests  28 passed (28)

どうやら,isFinite() は数値に変換してから判定する仕様らしく,上記のように null, "0", true, false は 0 に変換され true となります*1

これはあまり直感的ではないので,Number.isFinite() を使用するべきです.