在JavaScript中,为什么“ 0”等于false,但是在通过“ if”进行测试时,其本身不是false?

2020/10/12 01:01 · javascript ·  · 0评论

下面显示"0"了Javascript中的false:

>>> "0" == false
true

>>> false == "0"
true

那么,为什么要打印以下内容"ha"

>>> if ("0") console.log("ha")
ha

原因是因为当您显式这样做时"0" == false,双方都将转换为数字,然后执行比较。

当您执行以下操作:时if ("0") console.log("ha"),正在测试字符串值。任何非空字符串为true,而空字符串为false

等于(==)

如果两个操作数的类型不同,则JavaScript会转换操作数,然后进行严格比较。如果操作数是数字或布尔值,则如果可能,将操作数转换为数字;否则,操作数将转换为数字。否则,如果其中一个操作数是一个字符串,则将另一个操作数转换为字符串(如果可能)。如果两个操作数都是对象,则JavaScript将比较内部引用,当操作数引用内存中的同一对象时,内部引用是相等的。

(从比较运算符在Mozilla开发者网络)

显示问题的表格:

如果声明为真

和==
javascript中所有对象类型的真实比较

故事的寓意===
严格平等显示理智

表生成功劳:https : //github.com/dorey/JavaScript-Equality-Table

根据规范。

12.5 if语句 
.....

2.如果ToBoolean(GetValue(exprRef))为true,则 
一种。返回评估第一条陈述的结果。
3.其他 
....

根据规范,ToBoolean是

根据表11,抽象操作ToBoolean将其参数转换为Boolean类型的值:

该表说明了有关字符串的信息:

在此处输入图片说明

如果参数为空String(长度为零),则结果为false;否则,结果为false。否则结果为真

现在,解释一下为什么"0" == false您应该阅读均等运算符,该运算符声明其从抽象运算GetValue(lref)获取的值与右侧的相同。

将该相关部分描述为:

如果是IsPropertyReference(V),则 
一种。如果HasPrimitiveBase(V)为false,则让get为base的[[Get]]内部方法,否则让get
是下面定义的特殊[[Get]]内部方法。 
b。返回使用base作为此值调用get内部方法并传递的结果
参数的GetReferencedName(V)

换句话说,字符串具有原始基数,该基数会回调内部的get方法并最终看起来为false。

如果要使用GetValue操作use来评估事物==,如果要使用ToBoolean,use ===(也称为“严格”相等运算符)来评估事物

在PHP中,字符串"0"是虚假的(在布尔上下文中使用时为false)。在JavaScript中,所有非空字符串都是真实的。

诀窍在于,==针对布尔值的运算符不会在布尔值上下文中求值,而是转换为数字,如果是通过解析为十进制完成的字符串。因此,您将获得Number0而不是true布尔值true

这在语言设计上确实很差劲,这也是我们尝试不使用不幸的==运算符的原因之一使用===代替。

// I usually do this:

x = "0" ;

if (!!+x) console.log('I am true');
else      console.log('I am false');

// Essentially converting string to integer and then boolean.

您在引号周围将0其设置为字符串,该字符串被评估为true。

删除引号,它应该工作。

if (0) console.log("ha") 

这完全是因为ECMA规范..."0" == false由于此处http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3指定的规则...并且if ('0')由于此处此处指定的规则计算为true http:/ /ecma262-5.com/ELS5_HTML.htm#Section_12.5

“ if”表达式测试真实性,而双等于测试类型独立性等效。正如这里其他人所指出的,字符串始终是真实的。如果双等式正在测试两个操作数的真实性,然后比较结果,那么您将获得直觉上假设的结果,即("0" == true) === true正如道格·克罗克福德(Doug Crockford)在其出色的JavaScript:《好部分》中所说的那样,“ [==强制其操作数类型的规则]复杂而难忘……缺乏传递性令人震惊。” 足以说一个操作数是类型强制的以匹配另一个操作数,并且“ 0”最终被解释为数字零,

==等于运算符在将参数转换为数字后对其求值。
因此,将字符串零“ 0”转换为Number数据类型,将布尔值false转换为Number 0

"0" == false // true

同样适用于`

false == "0" //true

===严格相等性检查使用原始数据类型评估参数

"0" === false // false, because "0" is a string and false is boolean

同样适用于

false === "0" // false

if("0") console.log("ha");

字符串“ 0”不与任何参数进行比较,并且字符串是真实值,直到或除非将其与任何参数进行比较。就像

if(true) console.log("ha");

if (0) console.log("ha"); // empty console line, because 0 is false

`

这是因为JavaScript在布尔上下文和您的代码中使用类型强制

if ("0") 

在布尔上下文中将被强制为true。

Javascript中还有其他真实值,它们在布尔上下文中会被强制为true,因此执行if块是:

if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)

if (x) 

使用JavaScript的内部toBoolean强制x(http://es5.github.com/#x9.2)

x == false

使用内部toNumber强制(http://es5.github.com/#x9.3)或对象的toPrimitive强制双方(http://es5.github.com/#x9.1)

有关完整的详细信息,请参见http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

我有同样的问题,我找到了一个可行的解决方案,如下所示:

原因是

    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,invalid,我们希望它表示有效的true id。

因此,对于id类型,我们必须使用以下代码:

   if ((Id !== undefined) && (Id !== null) && (Id !== "")){
                                                                                
                                                                            } else {

                                                                            }
                                                                            

对于其他字符串类型,我们可以使用if(string){},因为null,undefined,空字符串都将计算为false,这是正确的。

       if (string_type_variable) { }
本文地址:http://javascript.askforanswer.com/zaijavascriptzhongweishenme-0dengyufalsedanshizaitongguo-ifjinxingceshishiqibenchan.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!