A better streams API is possible for JavaScript
What does the 'in' keyword in javascript mean? - Stack Overflow
Is it just me does anyone else feel that javascript world has gone crazy?
As someone who has written JS for well over a decade I can confirm this. JavaScript is going through something not unlike what Java went through in the 90s. It was getting popular, so everyone had their own ideas on the best way to write it. Frameworks started popping out of the woodwork left and right, and some gained traction, and everyone had their own opinion on each. Eventually POJO (plain old Java object) became more popular -- meaning quit using objects these frameworks provide and use the ones Java provides. One can only hope we see the same with JS.
As to how people keep up with it, I suspect that's not quite how it works. People learn a specific technology and tend to stick with it, so as others pop up they begrudgingly go along with it, but don't really want to take the time to jump head-first into the topic, and tend to rely on the "evangelists" of said technology to keep them in line. This is why I've had a falling out with JS. It used to be a language I could do anything with, but now it's a language that is easy to learn, but impossible to master as long as new frameworks or methodologies keep coming out of nowhere and becoming popular.
The community does seem to have become rather content with React, but only time will tell.
More on reddit.comDoes anyone still use IndexedDB in JavaScript? : webdev
Videos
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
Taking the alerts in order:
- alert #1 is never reached because
("aa" in window) === trueso theifboolean 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.