2

我在 JavaScript 中遇到了一些奇怪的事情(可能不是,更可能是我没有真正理解),我很想知道为什么事情会像他们那样表现。

当我做:

var index = '1';
index++;
alert(index);
index = index + 1;
alert(index);
index = true ? index + 1 : 0;
alert(index);

http://jsfiddle.net/5mdmJ/中的警报将变为“2”、“3”、“4”

当我颠倒顺序并执行此操作时(http://jsfiddle.net/5mdmJ/1/):

var index = '1';
index = true ? index + 1 : 0;
alert(index);
index = index + 1;
alert(index);
index++;
alert(index);

我会有“11”、“111”和“112”。

我确实知道这是索引是字符串的东西,但我真的不明白为什么它在示例 1 中一直是 int 类型,而在示例 2 中是字符串类型。我知道这可能会非常简单,但我现在找不到任何可以真正向我阐明正在发生的事情背后的逻辑的东西。类型有变化吗?为什么以及何时会发生这种情况?

感谢任何提示或文章或任何东西!

4

7 回答 7

3

单个加号运算符对字符串和整数进行了重载。在第一个示例中,该++运算符仅针对ints 定义,因此 index 被转换为数字,然后递增。之后,加号运算符表示加法。由于第二个示例中的 index 是一个字符串,因此加号运算符表示连接。

于 2011-08-29T12:07:43.870 回答
3

但我真的不明白为什么它在示例 1 中一直是 int 类型的

与 不同+,它有两个含义(数字的加法,字符串的连接),++没有歧义 - 它总是意味着“增量”

因此,当您++在字符串上运行时,它会将其转换为数字。由于在示例 #2 中没有发生这种情况,因此这些+操作都是串联的。

var x = '1';
x++;
alert(typeof x); // "number"
于 2011-08-29T12:08:05.943 回答
2

答案是,由于 js 是松散类型的,它从您执行的第一个操作开始。

在您的示例 1 中,第一个操作是排他算术运算,js 正确解释它并一直认为它是 INT

在您的示例 2 中,第一个操作是比较操作,js 将其解释为布尔值,然后立即关闭属性字符串。

这就是为什么你会得到不同的行为。

于 2011-08-29T12:09:03.997 回答
1

this:index++;是一个数字函数。请注意,我没有说整数。JavaScript 中没有整数之类的东西。所有数字都是浮点数。

This:index = true ? index + 1 : 0;是字符串连接,因为 index 是一个字符串。如果 index 是一个数字,那么它将两者相加。

所以发生的事情是 ++ 运算符将字符串转换为数字并添加值。第二个是将数字转换为字符串并将两个字符串附加在一起以形成一个新字符串(请记住,在 JavaScript 中字符串是不可变的)。

于 2011-08-29T12:07:58.237 回答
1

原因是variable++会先将变量转换为数字,然后再加一。而 variable + 1 只会将 1 添加到变量中,但不会转换它。

于 2011-08-29T12:08:07.117 回答
1

这是因为连接字符串或变量时的类型优先级。

"1" + 2 + 3; // -> "123" 
4 + 3 + "2"; // -> "72" ; 4 + 3 = 7 ; 7 + "2" = "72"
于 2011-08-29T12:12:19.427 回答
0

我的猜测是,当你这样做时index++,它被认为是一个“int”,并且在示例一中保持这种状态,但是当你这样做时index + 1,它被认为是一个字符串,并且在示例 2 中保持这种状态。

于 2011-08-29T12:07:32.610 回答