全局作用域中的console.log(!status)产生了意外的结果

22
遇到了一个有趣的问题。我试图切换分配给变量的布尔值,但它没有起作用。最终我尝试了这段代码。

遇到了一个有趣的问题。我试图切换分配给变量的布尔值,但它没有起作用。最终我尝试了这段代码。

var status = false;
console.log(!status);

我原本期望控制台输出true,但是实际得到了false。我认为JavaScript会先执行括号内的代码并获取它的值,然后将该值打印到控制台上。你能否解释一下为什么控制台没有输出true值?


1
在IE中我得到了“true”,但在Chrome和Firefox中我得到了“false”,这很有趣。 - Ajay Narain Mathur
2
当使用status变量时,我得到false,但对于其他变量我得到true。 - Akshay
4
window.status 已经存在了。我猜测可能存在冲突。 - elclanrs
3
这是关于Window.status属性的文档。Window.status属性返回当前窗口的状态栏文本。它可以被设置为任何字符串,但通常用于显示有关页面加载或其他活动的信息。然而,在现代浏览器中,该属性已经过时,建议使用其他方式来向用户提供此类信息。 - Jaromanda X
1
无论您分配给window.status的值是什么,它都会转换为字符串,因此!status!"false"→true。 - rishat
显示剩余2条评论
5个回答

26
window.status 已经存在(它用于获取/设置浏览器状态栏的文本),并且当一个值被分配给它时,它会被转换为一个字符串。如果您执行console.log( status );,您将看到status具有字符串值"false",这会导致您看到输出false,因为您实际上有!"false",而"false"在JavaScript中是一个真值。 如果您在函数内做同样的事情,您将得到预期的输出:
(function ( ) {
  var status = false;
  console.log(!status); // true
})();

4

MDN

var statu = false;
console.log(!statu);

窗口状态变量window.status已经存在,因此您不能使用status变量。


1
请看下面的截图,它显示状态是window对象的一个属性。因此,这直接涉及到window.status。不建议重复使用某些具有默认含义的变量和属性(提醒oop语言中的关键字)。

enter image description here


1

像这样检查status的类型:

typeof status

输出结果将是:"字符串"
请注意,false"false" 是不同的。
当你定义时:
var status = false; //which is actually "false"

这就是为什么你没有得到true的原因。

-2
(function ( ) {
  var status = false;
  console.log(!status);
})();

这将为您提供预期的输出。
"status"是一个预定义的与实现相关的JavaScript对象、方法或属性的名称。最好避免使用标识符作为JavaScript变量的名称。如果您在函数外部使用它,那么这意味着您想通过状态值来实现其他事情。

但是为什么呢?请解释你的答案。 - Stephan Bijzitter
我已经编辑了我的答案并解释了@StephanBijzitter。 - Bharat Jain
2
不,这不是一个“保留字”。如果是的话,你会收到语法错误。 - Bergi
@Bergi FYI:请看这里。您可以查看保留字列表。 - Bharat Jain
1
@BharatJain 是的。它不在那个保留字列表中。它在“JavaScript变量名称应避免使用的标识符列表”中。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接