2014-10-03 62 views
0

我只是发布了一些奇怪的东西(至少对我来说)发生在JavaScript中(不知道也许在其他语言中)。我有这个例子:在JavaScript中添加带整数字符串的奇怪行为?

var a = "1"; 
var b = 1; 

console.log(a + b); // this one returns 11 as it suppose 
console.log(b + a); // this one returns also 11 as it suppose 
console.log(a + b + b); // this one returns 111? why not 12 ? 
console.log(b + b + a); // but this return 21 as it suppose 

有人可以向我解释为什么会发生这种情况?感谢先进的和抱歉,如果这是一个非常愚蠢的问题。

+0

操作都被处理由左到右。只要遇到字符串,它就会串联。否则它会添加。由于首先遇到了“b + b”,因此将其评估为加法,然后与“a”连接。你可以看看这里的行为:http://es5.github.io/#x11.6.1 – Ian 2014-10-03 18:34:02

+1

非常感谢@Ian。 – user2019037 2014-10-03 18:37:40

回答

2

让我们打破你的代码:

var a = "1", // string 
    b = 1;  // number 

console.log(a + b); 
// a is a string and b is a number 
// read from left to right 
// string first, so when + goes to concatenate the two variables, you get 
// a + b.toString() == "1" + "1" == "11" 

console.log(b + a); 
// same thing as above because of the .toString() method 
// except the + operator sees number + string (versus string + number) 
// however, this still casts the number to a string, since that's how 
// strings and numbers are concatenated 

console.log(a + b + b) 
// same as above 
// read from left to right 
// string is encountered first, so everything after it is cast to a string 
// "1" + b.toString() + b.toString() == "1" + "2" + "2" == "122" 
// if you want it to be 12, you need to do 
// console.log(a + (b + b)) 

console.log(b + b + a) 
// the first + operator sees two integers, so they get added together first 
// now it's console.log(2 + a) 
// so (2).toString() + a == "2" + "1" == "21", if you follow the logic 
// from the second example 
+0

谢谢@royhowie。 – user2019037 2014-10-03 18:39:37

1

a是一个字符串,所以当你对一个字符串进行数学运算时,它会简单地连接起来。让我们去通你:

console.log(a + b + b); // a + b = 11 - which is now a string + b = 111; 
console.log(b + b + a); // b + b = 2 + a string 1 = 21 
+0

非常感谢您的回答@tymeJV – user2019037 2014-10-03 18:41:01