未定义的变量,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) 除非你知道算法,否则你不能简单地假设一个结果。您需要了解它的工作原理。
例如,null
和 undefined
是一种特殊情况。除了被认为彼此相等之外,它们不进行任何类型转换。
否则,通常会进行类型转换,试图将两个操作数归约为一个通用类型。这通常以 toNumber 转换告终。
这就是为什么:
null == undefined; // true
null == 0; // false
+null == '0' // true
所以如果你知道算法是如何工作的,你就会知道undefined
永远不会等于除了undefined
和null
之外的任何东西,但是其他不严格相等的类型可能会被强制转换为相等的类型。
所以if(!x)
和if(x==false)
是完全不同的测试。
if(!x)
执行 toBoolean 转换。
if(x == false)
使用复杂的算法来决定正确的转换。
所以...
if(x == false)
...如果x
是undefined
,则判断不等于false
,但如果x
是0
甚至"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
、-0
、false
、null
、undefined
。所有其他值为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");
特别是undefined
和null
都不是真假,但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的主要内容,如果未能解决你的问题,请参考以下文章
ReactJS event.target.value 返回未定义