为什么JavaScript根据字符串的位置以不同的方式对字符串和整数求值?
一个例子:
console.log("1" + 2 + 3);
console.log(2 + 5 + "8");
第一行打印123,第二行打印78.
答案 0 :(得分:21)
表达式的评估为left to right,因此:
"1" + 2 + 3 -> "12" + 3 -> "123"
2 + 5 + "8" -> 7 + "8" -> "78"
答案 1 :(得分:7)
在您提及的情况下,JavaScript的类型转换推断您正在寻找将所有参数的类型转换为与+
运算符的第一个参数的类型相匹配。
这就是为什么在第一种情况下你提到以字符串"1"
开头的添加将其他参数转换为字符串。
在第二种情况下,您提到了console.log(2 + 5 + "8")
。 +
运算符的第一个参数是一个整数,这就是为什么JavaScript的类型转换假设您需要一个整数。
答案 2 :(得分:2)
嗯,那是因为+
运算符过载了。
这就是为什么,当你这样做时
console.log("1" + 2 + 3);
它连接第一个和第二个操作数(因为第一个是一个字符串)给出一个字符串" 12",并且它再次将它与第三个操作数连接起来,原因相同。
然而,当你这样做时
console.log(2 + 5 + "8");
它将第一个和第二个操作数(都是数字)相加,得到7
,最后将其与第三个操作数连接,原因如上所述。
答案 3 :(得分:0)
表达式从左到右进行评估。
因此,如果您使用"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
答案 4 :(得分:0)
我认为它被称为鸭子铸造。如果它看起来像一只鸭子,像鸭子一样嘎嘎叫它一定是鸭子。如果它看起来像一个字符串" 1"那么它可能是一个字符串。
JavaScript似乎也从左到右,从特定(int)到一般(字符串)进行评估。
在你的第一个例子中,console.log(" 1" + 2 + 3),它正在评估" 1"因为引号而作为字符串,并假设您想要连接它后面的所有内容。它写了" 123"结果。
在第二个例子中,console.log(2 + 5 +" 8"),它接受一个int并添加到另一个产生7的int,然后遇到一个字符串,所以它假设你想做串联所以它写了" 78"作为一个字符串。如果你想要严格评估int值,你可以使用parseInt(" 8")将你的8转换回int。