関数かどうか判定

関数と他のオブジェクトとの判別は、typeofinstanceof演算子でできる。

function 関数() {}
class クラス {}
function* ジェネレータ() {}

let 関数たち = [関数, クラス, ジェネレータ]
let 全部関数なの = 関数たち.every((e) => {
  return typeof e === 'function' && e instanceof Function
})
console.log(全部関数なの) // true

アクセサは関数ではない

関数のようなアクセサtypeofinstanceofで判定できない。

// アクセサは参照や代入時に関数のような処理を付随できるが、関数ではない。
// (typeofやinstanceofで判定できない)

let アクセサ = {
  get ゲッター() {return 'ゲット'},
  set セッター(引数) {return '無駄なreturn'}
}

// ゲッターは参照時にその戻り値を評価する。
// セッターは参照するとundefined
console.log(アクセサ.ゲッター, アクセサ.セッター) // ゲット undefined
// (typeofなどでの関数判定は無意味)