😺

JavaScript である値がオブジェクト型であることを判定する変なテク

2024/03/24に公開

TC39の活動で有名なJordan Harbandが作成した下記issueで知ったのでメモ。

https://github.com/microsoft/TypeScript/issues/57000

前提として、次のコードによって x がオブジェクト型であることを判断できる。JavaScriptにおける nulltypeof の結果が "object" になるという有名な変な挙動がカバーされている。

function isObjectA(x) {
  return (typeof x === "object" && x !== null) || typeof x === "function";
}

そして、これと(ほとんど)同じことが、下記のコードでもできる。

function isObjectB(x) {
  return Object(x) === x;
}
isObjectA(3); // false
isObjectB(3); // false

isObjectA({}); // true
isObjectB({}); // true

isObjectA(() => {}); // true
isObjectB(() => {}); // true

本当にどうでもいいが、document.all を渡すとこの2つの関数は異なる結果を示す。

isObjectA(document.all); // false
isObjectB(document.all); // true

document.all をカバーしたければ Object(x) === x を使おう。

今日もJavaScriptはおもしろい。

Discussion