使用“;在“;运算符和JavaScript中的点表示法

Difference in using "in" operator and dot notation in JavaScript

本文关键字:表示 运算符 使用 JavaScript      更新时间:2024-05-12

我有一个问题一直困扰着我。如果我声明了一个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
} 

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

正如Johan所指出的,检查得到的是一个假值。

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");

window.a在给它一个值之前就是undefined,并且

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

由于布尔值(未定义)===false,因此未到达if语句中的console.log

转到您的控制台并像这样玩:

var a;

未定义

'a' in window

真实

window.a

未定义

a = 1

1

window.a

1

'a' in window

真实

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

.注释访问上下文中变量的值。因此,使用.的表达式可能会返回任何值,包括undefined,如果不是的话。

现在您已经知道了为每个表达式返回的内容,请将其与if语句中返回每个值时的求值内容混合起来。

正如您可能知道的,undefined将评估为false1true都将评估为true,从而产生您所面临的行为。