使用上的差异;在;JavaScript中的运算符和点表示法

使用上的差异;在;JavaScript中的运算符和点表示法,javascript,Javascript,我有一个问题正困扰着我。如果我声明一个var a,然后尝试使用“in”操作符对其进行测试,我会得到一个真实的结果,如果我使用点符号进行相同的测试,我会得到一个错误的结果,例如 var a; if('a' in window) { console.log('a in window'); // this is written to the console } if (window.a) { console.log('window.a'); // nothing happening her

我有一个问题正困扰着我。如果我声明一个
var a
,然后尝试使用“in”操作符对其进行测试,我会得到一个真实的结果,如果我使用点符号进行相同的测试,我会得到一个错误的结果,例如

var a;

if('a' in window) {
  console.log('a in window'); // this is written to the console
}

if (window.a) {
  console.log('window.a'); // nothing happening here
}
现在我注意到当我给一个值时,两个输出都起作用。。。看看这个,注意我是如何检查它是否不存在的:

var a;

if('a' in window) {
  console.log('a in window'); // this is written to the console
}

if (!window.a) {
  console.log('!window.a'); // this is written to the console
}

a = 1;

if (window.a) {
  console.log('window.a'); // this is written to the console
} 

那么,为什么只有当变量被赋值时,点符号才起作用呢?我知道这是一个愚蠢的问题,但到目前为止我还不能得到一个明确的答案

正如约翰指出的,检查得到的是一个错误的值

if ('a' in window) console.log("a exists");
if (window.a) console.log("window.a is a truthy value");
if (!window.a) console.log("window.a is a falsey value");
if (typeof window.a != "undefined") console.log("window.a is not undefined");

窗口。在给它赋值之前,a
未定义的
,并且

if (undefined) === if (Boolean(undefined))

由于Boolean(undefined)===false,if语句中的
console.log
未到达。

转到控制台,按如下方式播放:

var a;
未定义

真的

未定义

一,

一,

真的

关键字中的
检查上下文中是否存在变量。因此,在
中使用
的表达式将始终根据其存在而不是其值返回
true
false

notaction在上下文中访问变量的值。因此,使用
的表达式可能会返回任何值,包括
未定义的值(如果不是)

现在您已经知道了每个表达式返回的内容,可以将其与在if语句中返回每个值时所执行的计算混合起来


您可能知道,
undefined
将计算为
false
,而
1
true
都将计算为true,从而导致您面临的行为。

这是因为
window.a
yeilds
undefined
-它将计算为false
'a' in window
window.a
a = 1
window.a
'a' in window