为什么JavaScript使用字符串和int对plus进行不同的计算?

为什么JavaScript使用字符串和int对plus进行不同的计算?,javascript,string,int,Javascript,String,Int,为什么JavaScript使用字符串和整数计算加号时会根据字符串的位置而有所不同 例如: console.log("1" + 2 + 3); console.log(2 + 5 + "8"); 第一行打印123,第二行打印78。在您提到的情况下,JavaScript的类型转换意味着您希望将所有参数的类型转换为与第一个参数的类型匹配的+运算符 这就是为什么在您提到的第一个例子中,以字符串“1”开头的加法将其他参数转换为字符串 在第二种情况下,您提到了console.log(2+5+“8”)。+运

为什么JavaScript使用字符串和整数计算加号时会根据字符串的位置而有所不同

例如:

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

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

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

这就是为什么在您提到的第一个例子中,以字符串
“1”
开头的加法将其他参数转换为字符串


在第二种情况下,您提到了
console.log(2+5+“8”)
+
运算符的第一个参数是一个整数,这就是为什么JavaScript的类型转换假定您想要一个整数。

嗯,这是因为
+
运算符重载

  • 当与两个整数一起使用时,它将它们相加
  • 当与两个字符串一起使用时,它将它们连接起来
  • 当在字符串和整数之间使用时,它将它们连接起来
这就是为什么,当你这么做的时候

console.log("1" + 2 + 3);
console.log(2 + 5 + "8");
它将第一个操作数和第二个操作数(因为第一个操作数是字符串)连接在一起,得到一个字符串“12”,出于同样的原因,它再次将其与第三个操作数连接在一起

然而,当你

console.log("1" + 2 + 3);
console.log(2 + 5 + "8");
它将第一个操作数和第二个操作数(都是数字)相加,得到
7
,最后出于上述原因将其与第三个操作数连接起来

  • JavaScript确实如此
  • 表达式将被计算,因此:

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

  • 表达式从左到右求值

    因此,如果使用的是
    “1”+2+3
    ,并且操作数的类型不同,它将追加,否则,如果操作数的类型是int,它将追加

    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
    

    我想这叫鸭子铸造。如果它看起来像只鸭子,嘎嘎叫起来像只鸭子,那它一定是只鸭子。如果它看起来像一个字符串“1”,那么它可能是一个字符串

    JavaScript似乎也可以从左到右,从特定(int)到一般(string)进行计算

    在您的第一个示例console.log(“1”+2+3”)中,它将“1”作为一个字符串进行计算,因为有引号,并且假设您希望将它后面的所有内容连接起来。结果写“123”


    在第二个示例console.log(2+5+“8”)中,它接受一个int并添加到另一个int生成7,然后遇到一个字符串,因此它假设您要进行串联,所以它将“78”作为字符串写入。如果要严格计算int值,可以使用parseInt(“8”)将8转换回int。

    第一个将整个内容转换为字符串。第二个开始将数字相加,直到看到字符串,然后将整个内容转换为字符串。因为在javascript中,
    +
    既是加法操作数又是串联操作数,应用哪一个操作数取决于第一个值。因为字符串+字符串仍然是字符串。将字符串安全地添加到int类型是不可能的,因此它会强制第二个操作数与第一个操作数的类型相同