膨大な数の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