js小问题

今天看到一个js的问题,想了好久之后不得其解,到晚上才发现了问题所在,题目是这样的:

if(!("a" in window)){
  var a=1;
}
alert(a);

想必大家应该看到过这个题目,他的正确答案是1.
我的思考过程如下:


首先在js里边有个hoist机制,也就是变量和函数声明提升机制。根据我之前的理解。
第一步,if语句没起到隔离作用域的作用,变量a还是声明在全局的。所以接下来就要看判断条件
!("a" in window)是否成立了,他决定着变量a是否被被赋值。
第二步,接下来我们看!("a" in window)是否成立,注意======,我也就是在这里犯迷糊了,此处开始是错误的=========
我开始的时候想的是"a" 是一个字符串,如果他之前在被声明为全局变量了,那他应该存在于window对象里的,
从事实上推断,"a" in window应该是true,那么这样赋值语句才会没有起作用,从而弹出来的是 1.但是为什么"a" in window是true呢?字符串“a" 在之前从未出现过,所以就开始瞎想了,可能是条件语句里的类型转换,也查到了很重要的资料JavaScript真值表,不过对于此题还是一无所获
。==========
后来才想起来"a" in window 指的应该是判断window对象里边是否有a这个属性,就像for-in-obj 还有obj[name]一样,问题就这样解决了。应为a被声明为全局变量的,相当于window.a。

你可能感兴趣的:(js小问题)