9

I found this code:

if (!("aa" in window)) {  
    alert('oh my god');
    var aa = 1;  
}  
alert("aa" in window);
alert(aa);

This code the second alert is alert true,but,the third alert is 'undefined',and the alert in the 'if' is not run. Why?

I think the reason is the in; what is its effect?

I searched on Google, but found nothing, because Google thinks the word ‘in&srquo; is a filter word.

We always use the in in loops, but, frankly speaking, I use it but don’t really understand it.

LIXer
  • 342
  • 1
  • 4
  • 10
  • 1
    I guess that a variable named `aa` was created in the global context. `alert("aa" in window);` returns false for me but `aa = "foo"; alert("aa" in window);` returns true. – andyb May 30 '13 at 09:02
  • oh my god,i think i lost some code when i wroten the question... – LIXer May 30 '13 at 09:24
  • I think this is an entirely different question now if you are asking about alerts. I'd recommend editing the question title to a better description of your problem. – andyb May 30 '13 at 10:40
  • @LIXer I edited my answer to answer the new question but please try to fix your question immediately next time or to ask a new one when you realize the code you gave first time wasn't the right one for you. – Denys Séguret May 30 '13 at 12:44

3 Answers3

17

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
Denys Séguret
  • 372,613
  • 87
  • 782
  • 758
  • You're welcome. But you should remove the EDIT part of your question : questions aren't supposed to include the answer on SO. Let's make this clean for other future users coming by. – Denys Séguret May 31 '13 at 09:42
2

Taking the alerts in order:

  • alert #1 is never reached because ("aa" in window) === true so the if 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.

Community
  • 1
  • 1
andyb
  • 43,435
  • 12
  • 121
  • 150
  • 1
    thank you, i know the function scope but i consider no function in my code, oh no ,my javascript is so weakly – LIXer May 31 '13 at 06:07
  • Happy to help! It was an interesting question. Since there is no block scope in JavaScript (block scope defined as inside a `{...}`) the variable will be available outside the `if` block. – andyb May 31 '13 at 07:09
1

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 
}  
mohan mu
  • 73
  • 1
  • 4