未定义的变量,值== false!值
我用JavaScript编写的一段非常简单的代码存在问题,请问您能帮助我吗?
以下是我认为迄今为止关于JavaScript和变量的理解:
我在一个在线课程中找到了一个练习文件,我试图做到这一点,但是我没有在课程中得到相同的结果。 主要的问题是我通过“if value == false {...}”来比较值,而解决方案使用“if!value {...}”
所以我决定编写一个非常短的代码,以便自己尝试,但我得到的结果不一。 在下面的例子中,我期望这个JS代码生成两个相同的警报(“foo等于false”),但是第一个if语句返回“foo不等于false”,而第二个if返回(如预期的那样) “foo等于假”。
这是我写的:
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是另一个应该被评估为假的值,或者至少这是我记得的。
你能告诉我我做错了什么吗?
==
算法(抽象平等比较算法)不是你可以简单地假设一个结果,除非你知道算法。 你需要知道它是如何工作的细节。
例如, null
和undefined
是一个特例。 除了认为彼此相等之外,他们不做任何类型转换。
否则,通常会有一种类型转换尝试将两个操作数都减少为一个通用类型。 这通常会成为toNumber转换。
这就是为什么:
null == undefined; // true
null == 0; // false
+null == '0' // true
所以如果你知道算法是如何工作的,你知道undefined
永远不会等于除undefined
和null
之外的任何东西,但是其他类型不是严格相等的可能会被强制转换为相等的类型。
所以if(!x)
和if(x==false)
是完全不同的测试。
if(!x)
执行到布尔转换。
if(x == false)
使用复杂的算法来决定正确的转换。
所以......
if(x == false)
...如果x
undefined
,则确定为不等于false
,但如果x
为0
或甚至"0"
,则它将被认为等于false
。
0 == false; // true
"0" == false; // true
未定义不等于错误,但是当你试图蒸发:
if (undefined)
整个表达总是错误的
更多信息:http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN
真相与对等与true
是在JavaScript两回事。
if (...)
执行第一个语句,如果...
是“ 真理 ”,而不是当它们与任何其他特定值“相等”时,则第二个条件应该看起来像
if (!foo) {
alert("foo is falsy"); // Javascript executes this row
} else {
alert("foo is truthy");
}
JavaScript中有很多“falsy”值: NaN
, ""
, 0
, -0
, false
, null
, undefined
。 其他所有值都是truthy
。
!
操作符返回false
任何truthy价值和true
任何falsy
值,所以!x
是一样的(x ? false : true)
所有x
。
上一篇: Undefined variables, value == false versus !value
下一篇: How to find if an array contains a specific string in JavaScript/jQuery?