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()
を使用するべきです.