''是什么? JavaScript中的关键字是什么意思?

时间:2013-05-30 08:56:08

标签: javascript

我找到了这段代码:

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

此代码第二个警报是警报true,但是,第三个警报是“未定义”,并且“if”中的警报未运行。为什么?

我认为原因是in;它的作用是什么?

我在谷歌上搜索过,但一无所获,因为谷歌认为“在& srquo;是一个过滤词。

我们总是在循环中使用in,但坦率地说,我使用它但却不太了解它。

3 个答案:

答案 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

MDN reference on in

请注意,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)

按顺序发出警报:

    永远不会达到
  • 警告#1 ,因为("aa" in window) === true因此if布尔条件为false。

JavaScript已function scope,变量aa"hoisted",首先是范围的顶部,因此 已定义。

  • 警告#2

"aa" in window为真,因为该变量在被提升时被添加到窗口对象中。相当于只写:

var foo;
"foo" in window (which === true)
  • 提示#3

来自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 
}