【问题标题】:Why does JavaScript evaluate plus with string and int differently?为什么 JavaScript 用 string 和 int 以不同的方式计算 plus?
【发布时间】:2015-10-04 02:47:29
【问题描述】:

为什么 JavaScript 会根据字符串的位置对字符串和整数的 plus 进行不同的计算?

一个例子:

console.log("1" + 2 + 3);
console.log(2 + 5 + "8");

第一行打印 123,第二行打印 78。

【问题讨论】:

  • 第一个将整个内容转换为字符串。第二个开始将数字相加,直到它看到字符串,然后它将整个东西转换为字符串。
  • 因为在javascript中+既是加法操作数又是连接操作数,应用哪个取决于第一个值。
  • 因为string+string仍然是字符串。将字符串安全地添加到 int 类型是不可能的,因此它强制第二个操作数与第一个操作数相同。
  • 这里是关于javascript的问题wiki.theory.org/YourLanguageSucks
  • 我将把它留在这里:xkcd.com/1537

标签: javascript string int


【解决方案1】:

我认为这叫做鸭子铸造。如果它长得像鸭子,叫起来像鸭子,那它一定是鸭子。如果它看起来像一个字符串“1”,那么它可能是一个字符串。

JavaScript 似乎也从左到右以及从特定(int)到一般(字符串)进行评估。

在您的第一个示例中,console.log("1" + 2 + 3),由于引号将“1”作为字符串进行评估,并假设您想要连接它后面的所有内容。结果写入“123”。

在第二个例子中,console.log(2 + 5 + "8"),它接受一个 int 并添加到另一个 int 产生 7,然后遇到一个字符串,所以它假设你想要进行连接,所以它写“78”作为字符串。如果您想严格评估 int 值,可以使用 parseInt("8") 将 8 转换回 int。

【讨论】:

    【解决方案2】:

    表达式从左到右计算。

    所以如果你使用"1" + 2 + 3并且操作数的类型不同,它会追加,否则如果类型是整数,它会添加。

    case "1" + 2 + 3
    "1" +2 - different types- result - "12" string
    "12" + 3 - different types- result - "123" string
     case 2 + 5 + "8"
    2 + 5 - same types- result - 7 int
    7 + "8" - different types - result "78" string
    

    【讨论】:

      【解决方案3】:

      嗯,那是因为 + 运算符被重载了。

      • 当与两个整数一起使用时,它将它们相加。
      • 当与两个字符串一起使用时,它将它们连接起来。
      • 在字符串和整数之间使用时,它将它们连接起来。

      这就是为什么,当你这样做时

      console.log("1" + 2 + 3);
      

      它将第一个和第二个操作数连接起来(因为第一个是一个字符串)得到一个字符串“12”,并出于同样的原因再次将它与第三个操作数连接起来。

      但是,当你这样做时

      console.log(2 + 5 + "8");
      

      它将第一个和第二个操作数(都是数字)相加得到7,最后出于上述原因将它与第三个操作数连接起来。

      【讨论】:

        【解决方案4】:

        在您提到的情况下,JavaScript 的类型转换推断您希望将所有参数的类型转换为与 + 运算符的第一个参数的类型相匹配。

        这就是为什么在您提到的第一种情况下,以字符串 "1" 开头的加法会将其他参数转换为字符串。

        在你提到的第二种情况下console.log(2 + 5 + "8")+ 运算符的第一个参数是整数,这就是 JavaScript 的类型转换假定您需要整数的原因。

        【讨论】:

          【解决方案5】:
          1. JavaScript 执行 automatic type conversion
          2. 表达式被评估为left to right,因此:

            "1" + 2 + 3 -> "12" + 3 -> "123"
            
            2 + 5 + "8" -> 7 + "8" -> "78"
            

          【讨论】:

            猜你喜欢
            • 2017-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-14
            • 1970-01-01
            • 1970-01-01
            • 2016-06-12
            相关资源
            最近更新 更多