😺
JavaScript である値がオブジェクト型であることを判定する変なテク
TC39の活動で有名なJordan Harbandが作成した下記issueで知ったのでメモ。
前提として、次のコードによって x
がオブジェクト型であることを判断できる。JavaScriptにおける null
は typeof
の結果が "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