在JavaScript中,为什么"0"等于false,但在使用'if'测试时它本身不是false?

287
以下说明了在JavaScript中"0"被视为假(false):
>>> "0" == false
true

>>> false == "0"
true
所以为什么以下代码会输出 "ha"
>>> if ("0") console.log("ha")
ha

63
"0" 是一个字符串,由于它不是空的,所以被认为是真(true)。 - Digital Plane
10
"0" === false [...] false - user1385191
3
请查看Angus Croll的文章《JavaScript中的真相》。http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/ - timrwood
9
'0'==false 但是 '0' 不是假值(是的,JavaScript 可能很奇怪) - Linsey
8
@Linsey: "falsy"和"truthy"只是用来解释值如何转换为布尔值,当你使用==比较两个值时,它们永远不会被转换为布尔值,因此这个概念不适用。(这种转换规则更倾向于将值转换为数字。) - millimoose
显示剩余3条评论
15个回答

1

"if"表达式测试真实性,而双等号测试类型无关的等同性。字符串始终是真实的,正如其他人所指出的那样。如果双等号同时测试它的操作数是否为真,然后比较结果,那么你将会得到你直觉上所认为的结果,也就是("0" == true) === true。正如道格·克罗福德在他杰出的《JavaScript:精华版》中所说:“[==强制转换操作数类型的规则]复杂而难以记忆...缺乏传递性令人震惊。”足以说其中一个操作数被类型强制转换以匹配另一个操作数,并且“0”最终被解释为数字零,进而在转换为布尔值时等同于false(或者当转换为数字时false等同于零)。


0

0

我从搜索引擎过来,寻找一个将字符串"0"作为布尔值进行评估的解决方案。

上面已经解释了技术细节,所以我不再赘述,但我发现快速类型转换可以解决这个问题。

因此,如果有其他像我一样想要评估字符串10作为布尔值的人,就像PHP一样。那么你可以使用parseInt(),如下:

x = "0";
if(parseInt(x))
//false

0
在JS中,“==”符号不会检查变量的类型。因此,“0”= 0 = false(在JS中0 = false),并且在这种情况下将返回true,但如果您使用“===”,结果将为false。
当您使用“if”时,在以下情况下它将是“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)

0

我有同样的问题,我找到了以下有效的解决方案:

原因是

    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) { }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接