全局范围内的console.log(!status)产生意外结果

时间:2016-11-30 05:28:41

标签: javascript console.log

进入一个有趣的问题。我正在努力尝试切换分配给变量的布尔值。它没有用,最终我尝试了这段代码。

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

我希望它在控制台中提供true,但我得到false。我认为javascript会首先在括号内运行代码以找到它的值,然后在console.log中运行该值。你能解释一下为什么我没有在控制台中获得true值吗?

5 个答案:

答案 0 :(得分:26)

window.status已经存在(用于获取/设置浏览器状态栏的文本),当为其分配值时,它将转换为字符串。如果您执行console.log( status );,则会看到status的字符串值为"false",这会导致您看到输出false,因为您实际拥有!"false""false"是JavaScript中的真实价值。

如果你在一个函数中做同样的事情,你将获得预期的输出:

(function ( ) {
  var status = false;
  console.log(!status); // true
})();

答案 1 :(得分:4)

MDN

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

window.status已经存在。所以你不能使用状态变量。

答案 2 :(得分:1)

请参阅下面的屏幕截图,其中说明状态是窗口中的属性。 所以这直接指向window.status。 不建议重复使用具有默认含义的某些变量和属性(在oops语言中提醒关键字

enter image description here

答案 3 :(得分:1)

检查status的类型如下:

typeof status

输出结果为:"string"

请注意,false"false"不相同。

定义时:

var status = false; //which is actually "false"

这就是为什么你没有得到true

答案 4 :(得分:-2)

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

这将为您提供预期的输出。

"的状态"是依赖于实现的JavaScript对象,方法或属性的预定义名称。最好将标识符作为JavaScript变量的名称来避免。如果您在函数外部使用它,则意味着您希望按状态值实现任何其他事物。