我找到了这段代码:
if (!("aa" in window)) {
alert('oh my god');
var aa = 1;
}
alert("aa" in window);
alert(aa);
此代码第二个警报是警报true
,但是,第三个警报是“未定义”,并且“if”中的警报未运行。为什么?
我认为原因是in
;它的作用是什么?
我在谷歌上搜索过,但一无所获,因为谷歌认为“在& srquo;是一个过滤词。
我们总是在循环中使用in
,但坦率地说,我使用它但却不太了解它。
答案 0 :(得分:11)
这将测试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
。
请注意,for...in
语句的不同之处在于它并不真正使用in
运算符,而是一个特定的构造。
<强> MDN reference on for...in 强>
编辑:对您编辑的问题的解释(与第一个问题非常不同):
您的混淆似乎源于您在一个区块中声明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
答案 1 :(得分:1)
按顺序发出警报:
("aa" in window) === true
因此if
布尔条件为false。 JavaScript已function scope,变量aa
为"hoisted",首先是范围的顶部,因此 已定义。
"aa" in window
为真,因为该变量在被提升时被添加到窗口对象中。相当于只写:
var foo;
"foo" in window (which === true)
来自Standard ECMA-262 ECMAScript Language Specification :
变量语句声明按10.5中定义创建的变量。创建时,变量初始化为 undefined 。执行VariableStatement时,为Initialiser的变量分配其 AssignmentExpression 的值,而不是在创建变量时。
所以aa
未定义,因为从未执行过赋值。
答案 2 :(得分:1)
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
}