为什么 JavaScript 对 plus 和 string 和 int 的评估不同?

Why does JavaScript evaluate plus with string and int differently?

为什么 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);

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

然而,当你这样做时

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

它将第一个和第二个操作数(均为数字)相加得到 7,最后由于上述原因将其与第三个操作数连接。

  1. JavaScript automatic type conversion
  2. 表达式被计算 left to right 因此:

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

表达式从左到右计算。

所以如果你使用"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

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

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

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

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