使用JavaScript比较整数和字符串时的隐式数据类型转换==

使用JavaScript比较整数和字符串时的隐式数据类型转换==,javascript,implicit-conversion,comparison-operators,Javascript,Implicit Conversion,Comparison Operators,守则: var num = 20; if(num == "20") { alert("It works"); } else { alert("Not working"); } var values = ["123", undefined, "not a number", "123.45", "1234 error", "", " ",

守则:

var num = 20;

if(num == "20")
{
    alert("It works");
}
else
{
    alert("Not working");
}
var values = ["123",
          undefined,
          "not a number",
          "123.45",
          "1234 error",
          "",
          "       ",
          null,
          undefined,
          true,
          false,
          "true",
          "false"
          ];

for (var i = 0; i < values.length; i++){
    var x = values[i];
    console.log("Start");
    console.log(x);
    console.log(" Number(x) = " + Number(x));
    console.log(" parseInt(x, 10) = " + parseInt(x, 10));
    console.log(" parseFloat(x) = " + parseFloat(x));
    console.log(" +x = " + +x);
    console.log(" !!x = " + !!x);
    console.log("End");
}
问题是:

  • 在C编程中,我们有一个规则名数据类型提升,当混合使用数据类型(例如:整数和浮点的加法)时,在执行加法之前,整数将首先转换为浮点

  • 上面的代码将提示我一个带有消息
    “It works”
    的警报框,如果测试条件评估为真,则显示

  • 对于松散类型的JavaScript,我只是好奇:有没有像C这样的规则来决定在哪种情况下执行哪种转换?除此之外,上面的JavaScript代码在进行比较之前将
    num
    变量值从整数值转换为字符串值,反之亦然


  • 在JavaScript中,有两个运算符可用于比较两个值:
    =
    ==
    运算符

    引用JavaScript第六版权威指南:

    相等运算符
    =
    类似于严格相等运算符(
    ==
    ),但它 没有那么严格。如果两个操作数的值的类型不同, 它尝试一些类型转换,然后再次尝试比较

    严格相等运算符计算其操作数,然后比较 两个值如下,不执行类型转换

    因此,我建议您始终使用
    ==
    ,以避免出现以下问题:

    null == undefined // These two values are treated as equal. 
    "0" == 0 // String converts to a number before comparing. 
    0 == false // Boolean converts to number before comparing. 
    "0" == false // Both operands convert to numbers before comparing.
    

    另外,我可以像书中写的那样发布整个“比较指南”,但太长了;)请告诉我,我将为您编辑我的帖子。

    是的,equals运算符应用的所有类型转换规则都在ECMA-262规范中进行了描述

    该算法可能看起来相当复杂,但可以概括为以下几种情况:

  • 两个操作数的类型相同:

    • 对于基本体(字符串、数字、布尔值、Null、未定义)
      • 如果值完全相同,则返回true
    • 对于对象类型
      • 如果两个引用指向同一对象,则返回true
  • 如果两个操作数的类型不同

    • 如果一个操作数的类型为Null或未定义
      • 仅当另一个操作数值为
        null
        undefined
    • 如果其中一个操作数的类型为布尔或数字
      • (经过一些步骤后)将另一个操作数转换为数字并进行比较
  • 如果一个操作数是对象,另一个是基元

    • 对对象执行对象到基本体的转换,然后再次比较
  • 对象到基元的转换是通过一个名为的抽象操作进行的,此方法将尝试使用内部方法将对象转换为基元值

    这将尝试执行对象的
    valueOf
    toString
    方法,并将获取第一个返回原语值的值

    如果这两个方法不返回原语,或者它们不可调用,则会抛出
    TypeError
    ,例如:

    1 == { toString:null } // TypeError!
    
    上面的语句将产生一个
    TypeError
    ,因为默认的
    Object.prototype.valueOf
    方法只执行相同的对象实例(
    this
    ,而不是原语值),我们正在设置一个自己的
    toString
    属性,它不是函数

    您可能会感兴趣的一个朋友制作的小工具,它显示了在类型之间进行的所有步骤和递归比较:


      • 避免JavaScript中的隐式类型转换。在比较单个值之前,请始终采取步骤测试和/或转换单个值,以确保您是在逐个比较。始终显式测试undefined以确定某个值或属性是否有值,使用null表示对象变量或属性未引用任何对象,并转换和比较所有其他值,以确保针对相同类型的值执行操作。

        我知道问题已得到回答。下面我给出的是一个很少转换的例子。它对于JavaScript新手来说非常有用。为了便于理解,可以将以下输出与通用算法进行比较

        守则:

        var num = 20;
        
        if(num == "20")
        {
            alert("It works");
        }
        else
        {
            alert("Not working");
        }
        
        var values = ["123",
                  undefined,
                  "not a number",
                  "123.45",
                  "1234 error",
                  "",
                  "       ",
                  null,
                  undefined,
                  true,
                  false,
                  "true",
                  "false"
                  ];
        
        for (var i = 0; i < values.length; i++){
            var x = values[i];
            console.log("Start");
            console.log(x);
            console.log(" Number(x) = " + Number(x));
            console.log(" parseInt(x, 10) = " + parseInt(x, 10));
            console.log(" parseFloat(x) = " + parseFloat(x));
            console.log(" +x = " + +x);
            console.log(" !!x = " + !!x);
            console.log("End");
        }
        

        更好地使用下面的代码来理解隐式转换

        var值=[0,123,“0”,“123”,-0,+0,NaN,+NaN,-NaN,false,true,“false”,“true”,null,未定义,“null”,“未定义”,“GoodString”,未定义];
        对于(变量i=0;i>”);
        对于(var j=0;j}
        我很难从C编程切换回javascript或php编程,因为某些规则存在差异,就像我的大脑习惯了C中的规则一样,当我尝试用javascript编程时,我的大脑会一直思考C规则第1点,在javascript中所有数字都是浮点数,因此,不需要从
        int
        float
        促销。道格拉斯·克罗克福德同意你的观点:“我的建议是永远不要使用邪恶的双胞胎。相反,要始终使用
        ==
        !=
        ”(请参阅)。我喜欢这种方法,但是如果我希望
        “1”
        1
        在代码中的某个地方被认为是相等的,例如在JSON导入之后,我该怎么办<代码>解析int