我在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-typed而在exampled中是字符串类型的。 我知道这可能会非常简单,但我现在找不到任何能真正向我澄清正在发生的事情的逻辑。类型会改变吗?为什么以及何时发生这种情况?
感谢任何提示或文章或其他任何内容!
答案 0 :(得分:3)
对于字符串和整数,单个加号运算符被重载。在第一个示例中,++
运算符仅为int
定义,因此索引转换为数字,然后递增。然后,加号运算符表示加法。由于index是第二个示例中的字符串,因此plus运算符表示连接。
答案 1 :(得分:3)
但我真的不明白为什么它在示例1中一直是int-typed
与+
不同,++
有两个含义(数字的加法,字符串的连接),++
没有歧义 - 它总是意味着“增量”
因此,当您对字符串运行+
时,会将其转换为数字。由于在示例#2中没有发生这种情况,var x = '1';
x++;
alert(typeof x); // "number"
操作都是连接。
{{1}}
答案 2 :(得分:1)
这:index++;
是一个数字函数。请注意,我没有说整数。 JavaScript中没有整数这样的东西。所有数字都是浮点数。
这:index = true ? index + 1 : 0;
是字符串连接,因为index是一个字符串。如果index是一个数字,那么它会将两者加在一起。
所以发生的事情是++运算符正在将字符串转换为数字并添加值。在第二个中,它将数字转换为字符串并将两个字符串附加在一起以形成一个新字符串(记住在JavaScript字符串中是不可变的)。
答案 3 :(得分:1)
原因是变量++会先将变量转换为数字,然后再将其增加1。变量+ 1只会在变量中加1,但不会转换它。
答案 4 :(得分:1)
答案是,因为js是松散类型的,所以它从你正在执行的第一个操作开始。
在你的例子1中,第一个操作是一个独占的算术运算,js正确解释它并一直认为它是INT
在您的示例2中,第一个操作是比较操作,js将其解释为boolean,然后将其立即关闭属性字符串。
这就是为什么你会有不同的行为。
答案 5 :(得分:1)
这是因为连接字符串或变量时的类型优先级。
"1" + 2 + 3; // -> "123"
4 + 3 + "2"; // -> "72" ; 4 + 3 = 7 ; 7 + "2" = "72"
答案 6 :(得分:0)
我的GUESS是,当你执行index++
时,它被认为是“int”,并且在示例1中保持这种状态,但是当你执行index + 1
时,它被认为是一个字符串,并且保持不变通过例子2 ..