"0"
被视为假(false):>>> "0" == false
true
>>> false == "0"
true
所以为什么以下代码会输出 "ha"
?>>> if ("0") console.log("ha")
ha
"0"
被视为假(false):>>> "0" == false
true
>>> false == "0"
true
所以为什么以下代码会输出 "ha"
?>>> if ("0") console.log("ha")
ha
"if"表达式测试真实性,而双等号测试类型无关的等同性。字符串始终是真实的,正如其他人所指出的那样。如果双等号同时测试它的操作数是否为真,然后比较结果,那么你将会得到你直觉上所认为的结果,也就是("0" == true) === true
。正如道格·克罗福德在他杰出的《JavaScript:精华版》中所说:“[==强制转换操作数类型的规则]复杂而难以记忆...缺乏传递性令人震惊。”足以说其中一个操作数被类型强制转换以匹配另一个操作数,并且“0”最终被解释为数字零,进而在转换为布尔值时等同于false(或者当转换为数字时false等同于零)。
if (x)
使用JavaScript的内部toBoolean (http://es5.github.com/#x9.2)对x进行强制转换。
x == false
使用内部的toNumber强制转换(http://es5.github.com/#x9.3)或在对象上使用toPrimitive来强制转换双方
有关详细信息,请参见http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
我从搜索引擎过来,寻找一个将字符串"0"
作为布尔值进行评估的解决方案。
上面已经解释了技术细节,所以我不再赘述,但我发现快速类型转换可以解决这个问题。
因此,如果有其他像我一样想要评估字符串1
或0
作为布尔值的人,就像PHP一样。那么你可以使用parseInt()
,如下:
x = "0";
if(parseInt(x))
//false
[0, false, '', null, undefined, NaN] // null = undefined, 0 = false
所以
if("0") = if( ("0" !== 0) && ("0" !== false) && ("0" !== "") && ("0" !== null) && ("0" !== undefined) && ("0" !== NaN) )
= if(true && true && true && true && true && true)
= if(true)
我有同样的问题,我找到了以下有效的解决方案:
原因是
if (0) means false, if (-1, or any other number than 0) means true. following value are not truthy, null, undefined, 0, ""empty string, false, NaN
永远不要使用像id这样的数字类型
if (id) {}
对于可能取值为0的id类型,我们不能使用if (id) {},因为if (0)会被视为false、无效,而我们希望它作为真实的id号码时被视为有效。
因此,对于id类型,我们必须使用以下方法:
if ((Id !== undefined) && (Id !== null) && (Id !== "")){
} else {
}
对于其他字符串类型,我们可以使用 if (string) {},因为 null、undefined 和空字符串都会被评估为 false,这是正确的。
if (string_type_variable) { }
"0" === false [...] false
- user1385191'0'==false
但是 '0' 不是假值(是的,JavaScript 可能很奇怪) - Linsey==
比较两个值时,它们永远不会被转换为布尔值,因此这个概念不适用。(这种转换规则更倾向于将值转换为数字。) - millimoose