膨大な数のtypeof答えの代替案。
グローバルvar varname = value;スコープのステートメントで宣言されたグローバル変数
  windowオブジェクトのプロパティとしてアクセスできます。
このように、hasOwnProperty()メソッド
  (継承ではなく)オブジェクトが指定されたプロパティを独自のプロパティとして持っているかどうかを示すブール値を返します
  
  かどうかを判断するために使用できます
「varname」の a varはグローバルに宣言されています。つまり、のプロパティですwindow。
// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist
console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );
 
 
素晴らしいのhasOwnProperty()は、それを呼び出す際に、まだ宣言されていない可能性のある変数を使用しないことです。もちろん、これは最初から問題の半分です。
常に完璧または理想的なソリューションであるとは限りませんが、特定の状況では、それは単なる仕事です!
ノート
上記とはvar対照的に、を使用して変数を定義する場合、上記は当てはまりますlet。
  ブロックスコープのローカル変数を宣言し、オプションで値に初期化します。
  
  var変数をグローバルに、またはブロックのスコープに関係なく関数全体に対してローカルに定義するキーワードとは異なります。
  
  プログラムおよび関数の最上位レベルではlet、とは異なりvar、グローバルオブジェクトにプロパティは作成されません。
完全を const期すために:定数は、定義により、実際には変数ではありません(ただし、内容は変更可能です)。より適切に:
  var変数とは異なり、グローバル定数はウィンドウオブジェクトのプロパティにはなりません。定数の初期化子が必要です。つまり、その値は宣言されているのと同じステートメントで指定する必要があります。
  
  定数の値は、再割り当てによって変更することはできません。また、再宣言することもできません。
  
  const宣言は、値への読み取り専用の参照を作成します。それが保持する値が不変であることを意味するのではなく、変数識別子を再割り当てできないということだけです。
以来let、変数やconst定数が継承している任意のオブジェクトのプロパティことはありませんhasOwnProperty()方法を、彼らの存在を確認するために使用することはできません。
の可用性と使用についてhasOwnProperty():
  Objectの子孫であるすべてのオブジェクトがhasOwnProperty()メソッドを継承します。[...] in演算子とは異なり、このメソッドはオブジェクトのプロトタイプチェーンをチェックダウンしません。
               
              
fooが宣言されているかどうかを知りたい場合、typeof foo === 'undefined'またはtypeof foo === typeof undefined