window
これは、キーが であるプロパティ (塗りつぶされているかどうか) がオブジェクトにあるかどうかをテストします"aa"
。
undefined
この演算子は、値が次の場合でも機能するため、非常に便利です。
window.aa = undefined; // or just aa=undefined if you're in the global scope
console.log('aa' in window); // logs true
プロパティが列挙可能でない場合にも機能します。
console.log('length' in []); // logs true
あなたの場合、aa
値がないかもしれませんが、アラートが true を示している場合、プロパティは に追加されましたwindow
。
の MDN リファレンス
このステートメントは、実際には演算子for...in
を使用せず、特定の構造であるという点で異なることに注意してください。in
for...in の MDN リファレンス
編集:編集した質問の説明(最初のものとは非常に異なります):
var aa = 1;
あなたの混乱は、ブロック内で宣言したという事実から生じているようです。JavaScript の変数のスコープは、グローバル スコープの関数であり、宣言が巻き上げられることを知っておく必要があります。したがって、あなたのコードは実際には次と同等です
var aa = undefined;
if (!("aa" in window)) { // aa is in window, so we don't enter here
alert('oh my god');
aa = 1;
}
alert("aa" in window); // yes, the property exists, it's true
alert(aa); // aa is still undefined