What does the 'in' keyword in javascript mean?
This tests if the window
object has a property (filled or not) whose key is "aa"
.
This operator is very useful because it works even if the value is undefined
:
window.aa = undefined; // or just aa=undefined if you're in the global scope
console.log('aa' in window); // logs true
It also works if the property isn't enumerable :
console.log('length' in []); // logs true
In your case, there may not be an aa
value, but if the alert shows you true, the property was added to window
.
MDN reference on in
Note that the for...in
statement is different in that it doesn't really use the in
operator but is a specific construct.
MDN reference on for...in
EDIT : an explanation of your edited question (very different from the first one) :
Your confusion seems to arise from the fact you declared the var aa = 1;
in a block. You should know that the scope of a variable in JavaScript is either a function of the global scope and that declarations are hoisted. So your code is in fact equivalent to
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
in
checks if property exists in Object
// in the below snippet they are checking if 'aa' property exists in 'window' Object . Since variables are function declarations are hoisted. you'll never enter inside if block .
var aa = undefined ;
if (!("aa" in window)) { //2 => 'aa' property exists
alert('oh my god');
aa = 1; // 1 => hoisted
}
Taking the alerts in order:
- alert #1 is never reached because
("aa" in window) === true
so theif
boolean condition is false.
JavaScript has function scope and the variable aa
is "hoisted" up to the top of the scope first, so it is defined.
- alert #2
"aa" in window
is true because the variable was added to the window object when it was hoisted up. Equivalent to just writing:
var foo;
"foo" in window (which === true)
- alert #3
From the Standard ECMA-262 ECMAScript Language Specification :
A variable statement declares variables that are created as defined in 10.5. Variables are initialised to undefined when created. A variable with an Initialiser is assigned the value of its AssignmentExpression when the VariableStatement is executed, not when the variable is created.
So aa
is undefined since the assignment was never executed.