代码之家  ›  专栏  ›  技术社区  ›  Real Red.

在javascript中,<int value>=“<int value>”计算结果为true。为什么会这样?

  •  10
  • Real Red.  · 技术社区  · 17 年前

    如果我执行0=“0”,则计算结果为“真”。尝试,

    if( -777 == "-777" ) alert("same");
    

    警报发生。

    而且,值得注意的是,true==“true”并不等于true。尝试,

    if( false == "false" ) alert("same");
    

    警报不会发生。

    为什么会这样?

    8 回复  |  直到 17 年前
        1
  •  32
  •   Andrey Fedorov    15 年前

    ==的行为有点冗长,但在 ecma-262 spec :

    11.9.3抽象等式比较算法

    比较x==y,其中x和y 是值,产生真或假。 这种比较的执行方式如下: 跟随:

    1. 如果类型(X)与类型(Y)不同,转到步骤14。
    2. 如果类型(x)未定义,则返回true。
    3. 如果类型(x)为空,则返回true。
    4. 如果类型(x)不是数字,则转到步骤11。
    5. 如果x是NaN,则返回false。
    6. 如果Y是NaN,返回false。
    7. 如果x与y的数值相同,则返回true。
    8. 如果x为+0,y为“0”,则返回“真”。
    9. 如果x为“0”,y为+0,则返回“真”。
    10. 返回错误。
    11. 如果类型(x)是字符串,则如果x和y完全相同,则返回true。 字符序列(相同长度 以及相应的相同字符 职位)。否则,返回false。
    12. 如果类型(x)是布尔型,如果x和y都为真或都为真,则返回真。 错误的。否则,返回false。
    13. 如果x和y引用同一对象或它们引用同一对象,则返回true。 相互连接的对象(见13.1.2)。否则,返回false。
    14. 如果x为空,y未定义,则返回true。
    15. 如果x未定义,y为空,则返回true。
    16. 如果type(x)是数字,type(y)是字符串,则返回 比较x==t编号(y)。
    17. 如果类型(x)是字符串,而类型(y)是数字,则返回 比较t数量(x)==y。
    18. 如果类型(x)是布尔值,则返回比较结果tonumber(x)==y。
    19. 如果类型(Y)是布尔型,则返回比较X的结果== ToNumber(Y)。
    20. 如果类型(x)是字符串或数字,而类型(y)是对象,则返回 比较结果x== 上位(Y)。
    21. 如果type(x)是object,type(y)是string或number,则返回 比较结果 最高(x)==y。
    22. 返回错误。

    步骤16适用于前一个示例:

       0 == "0"            // apply 16
    ≡  0 == toNumber("0")
    ≡  0 == 0              // apply 7
    ≡  true
    

    步骤18,然后步骤16,适用于后者:

       true == "true"            // apply 18
    ≡  toNumber(true) == "true"
    ≡  1 == "true"               // apply 16
    ≡  1 == toNumber("true")
    ≡  1 == NaN                  // apply 6
    ≡  false
    
        2
  •  12
  •   Community Mohan Dere    9 年前

    这样做:

    if(5 == "5")
    

    使javascript将前5个转换为字符串。试试这个:

    if(5 === "5")
    

    这个 === 也使javascript评估类型。

    这实际上是这个的复制品 question 解释得很好。

        3
  •  7
  •   Community Mohan Dere    9 年前

    因为javascript是松散类型的,所以它将根据操作和操作中其他变量的类型自动强制转换变量。

    alert ("5" - 1);  // 4  (int)
    alert ("5" + 1);  // "51" (string) "+" is a string operator, too
    alert ("5" == 5); // true
    

    你可能想看的是 身份 核对( === )确保变量是 完全相同的 不仅仅是 平等的 .

    alert("5" == 5);  // true, these are equal
    alert("5" === 5); // false, these are not identical.
    

    另请参见此问题: How do the equality and identity comparison operators differ? PHP的实现与JavaScript非常相似。

        4
  •  4
  •   Christian C. Salvadó    17 年前

    javascript有两组相等运算符:

    • === and !== (严格相等运算符)
    • == and != (标准相等运算符)

    如果两个操作数的类型相同,标准的相等运算符将进行正确的比较,但如果它们的类型不同,则可能会得到一些意外的结果,例如:

    '' == '0' // false
    0 == '' // true
    0 == '0' // true
    false == 'false' // false
    false == '0' // true
    false == undefined // false
    false == null // false
    null == undefined // true
    ' \t\r\n ' == 0 // true
    

    为此,我总是建议使用严格的相等运算符(==,!=)。

        5
  •  1
  •   Chris Ballance    17 年前

    javascript不会将“false”转换为布尔值false,只会将其转换为字符串“false”。

    您可以将字符串值松散地强制转换为等效的整数,因此第一个示例可以工作。

        6
  •  1
  •   Seventoes    17 年前

    Javascript是一种松散类型的语言,因此只要解释器认为需要,就可以在运行时进行类型转换。如果将一个整数与一个字符串进行比较,会发现它们应该是相同的类型,因此,例如,“34”==34为真,因为整数可能会在比较之前被类型化为一个字符串。

    字符串“false”不是被类型化为bool的,而是被类型化为字符串的bool false,该字符串意外地具有值“0”,即包含数字0的字符串,给出“0”==“false”,这显然是错误的。

    如果要比较不带自动排版、有效比较类型和值的值,请使用三等号:

    5===“5”假 “string”==“字符串”真

        7
  •  1
  •   bobince    17 年前

    为什么会这样?

    因为JavaScript的类型都很松散,而且非常不一致。并不是所有的设计特性都经过深思熟虑;与其他编程语言相比,它的创建、实现和部署速度都非常快,这是为了让Netscape 2.0迅速推出。直到不久之后,它才安定下来,失去了一些更令人震惊的错误,并成为半标准化。

    寻找一些哲学上的理论基础,比如隐式类型的铸造规则,可能是一个徒劳的练习。Javascript唯一真正坚持的原则是 DWIM 非常消极。

        8
  •  0
  •   ryebr3ad    15 年前

    javascript将假值定义为0,布尔值为false,未定义。“0”之外的任何字符串都将为true,即使该字符串为“false”。

    真的有点烦人。