未定义的变量,value == false 与 !value

Posted

技术标签:

【中文标题】未定义的变量,value == false 与 !value【英文标题】:Undefined variables, value == false versus !value 【发布时间】:2012-02-02 14:04:07 【问题描述】:

我对一段用 javascript 编写的非常简单的代码有疑问,请您帮帮我吗?

以下是我认为到目前为止我对 javascript 和变量的理解:

在布尔运算中未定义的值被评估为假 通过在比较中使用 == 运算符,您是在询问两个值是否具有可比性,无论其类型如何

我在一个在线课程中找到了一个练习文件,我试着去做,但我没有得到与课程预期相同的结果;主要问题是我通过“if value == false ... ”比较值,而解决方案使用“if!value ... ”

所以我决定编写一个非常短的代码来自己尝试,但结果好坏参半。在下面的示例中,我希望此 JS 代码生成两个相同的警报(“foo 等于 false”),但第一个 if 语句返回“foo IS NOT equal to false”,而第二个 if 返回(如预期的那样) “foo 等于 false”。

这是我写的:

var foo = undefined;

if (foo == false) 
  alert("foo is equal to false");
 else 
  alert("foo is not equal to false"); // Javascript executes this row


if (!foo) 
  alert("foo is equal to false");  // Javascript executes this row
 else 
  alert("foo is not equal to false");

AFAIK 两个 IF 应该做同样的工作,事实上,当我尝试通过在第一行替换值“var foo = undefined;”来尝试它时用“var foo = 0;”它按预期工作,0 是另一个应该被评估为 false 的值,或者至少这是我记得的。

你能告诉我我做错了什么吗?

【问题讨论】:

那是因为不等于false。但是 undefined 是错误的,所以!undefined -> true 等于假和“假”有什么区别? 如果相等则x == false 如果为假则!x == true 【参考方案1】:

== 算法(Abstract Equality Comparison Algorithm) 除非你知道算法,否则你不能简单地假设一个结果。您需要了解它的工作原理。

例如,nullundefined 是一种特殊情况。除了被认为彼此相等之外,它们不进行任何类型转换。

否则,通常会进行类型转换,试图将两个操作数归约为一个通用类型。这通常以 toNumber 转换告终。

这就是为什么:

null == undefined; // true

null == 0; // false

+null == '0' // true

所以如果你知道算法是如何工作的,你就会知道undefined 永远不会等于除了undefinednull 之外的任何东西,但是其他不严格相等的类型可能会被强制转换为相等的类型。

所以if(!x)if(x==false) 是完全不同的测试。

if(!x) 执行 toBoolean 转换。

if(x == false) 使用复杂的算法来决定正确的转换。

所以...

if(x == false)

...如果xundefined,则判断不等于false,但如果x0甚至"0",则认为等于@987654343 @。

0 == false; // true

"0" == false; // true

【讨论】:

非常感谢,现在我开始明白我的错误了 有什么地方可以找到它的复杂算法或者它是如何工作的详细信息?你能解释一下吗? @mrReiha:这在 ECMAScript 语言规范中有详细说明。这是Abstract Equality Comparison Algorithm的链接【参考方案2】:

undefined 不等于 false,但是当你尝试评估时:

if (undefined)

整个表达式总是假的

更多信息:http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN

【讨论】:

【参考方案3】:

true 的真值和等价性在 JavaScript 中是两个不同的东西。

如果... 是“truthy”,则if (...) 执行第一条语句,而不是当它们“等于”任何其他特定值时,因此您的第二个条件应该看起来像

if (!foo) 
  alert("foo is falsy");  // Javascript executes this row
 else 
  alert("foo is truthy");

JavaScript 中有很多“虚假”值:NaN""0-0falsenullundefined。所有其他值为truthy

! 运算符对于任何真值返回 false,对于任何 falsy 值返回 true,因此对于所有 x!x(x ? false : true) 相同。

【讨论】:

【参考方案4】:

作为一般规则,我发现积极的结果更容易解析,几乎就像if(!foo) 是双重否定的,所以我倾向于把它转过来:

if (foo) 
  alert("foo is something or boolean true");
 else 
  alert("foo is null, undefined or boolean false");

特别是undefinednull 都不是真假,但javascript 可以处理一种速记,因为它是动态的。

上面的语句真的是这样的:

if (foo != null && (foo.constructor !== Boolean || foo == true)) 
  alert("foo is something or boolean true");
 else 
  alert("foo is null, undefined or boolean false");

您首先检查变量是否已定义,然后检查是否为布尔值。

同时你的虚假陈述正在检查不同的东西:

if (foo == false) 
  alert("foo is populated with the boolean false");
 else 
  alert("foo is true, something else or null");

【讨论】:

感谢您的澄清 "foo is null, undefined or boolean false" 或 +/-0 或 NaN 或空字符串。【参考方案5】:

let myVar = undefined
console.log(myVar)
console.log(!!myVar)

myVar = true
console.log(!!myVar)

【讨论】:

以上是关于未定义的变量,value == false 与 !value的主要内容,如果未能解决你的问题,请参考以下文章

未定义变量上的BaseX XQJ API错误,而变量已定义

Google 跟踪代码管理器自定义变量返回未定义

ReactJS event.target.value 返回未定义

Jquery对象分配给变量返回未定义[重复]

vue的data数据用的是全局变量,变量是普通数据类型,变量改变,data未改变

CoffeeScript 未定义