2011-08-29 15 views
2

我在JavaScript中遇到了一些奇怪的事情(可能不是,我更不可能这样做),我很想知道事情为什么会像他们一样。Javascript typing(Int/String)问题

当我这样做:

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”。

我知道这是索引是一个字符串的东西,但我真的不明白为什么它在整个例子中都是int型的,而在exampled中是字符串型的。 我知道这可能会很简单,但现在我找不到任何东西,这真的可以让我明白背后的逻辑。类型是否改变?这是为什么发生的?

感谢您的任何提示或文章或任何!

回答

1

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

在您的例子1个中的第一操作是独占算术运算和js正确地解释它,并认为它

在您的例子2中,第一操作是comparsion操作和js一路解释INT它作为布尔和那么它立即关闭属性字符串。

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

0

我的猜测是,当你做index++,它被认为是一个“INT”,并保持通过例如一个方式,但是当你做index + 1,它被认为是一个字符串,并通过实例2保持这样的..

3

对于字符串和整数,单加运算符是过载的。在第一个示例中,++运算符仅定义为int s,因此索引被转换为数字,然后递增。之后,加号运算符表示加法。由于index在第二个示例中是一个字符串,所以plus运算符表示串联。

1

这个:index++;是一个数字功能。注意我没有说整数。 JavaScript中没有这样的整数。所有的数字都是浮点数。

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

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

3

,但我真的不明白为什么它是INT类型的全部通过实例1

不像+,其中有两个方面的含义(除了对数,串联的字符串)的方式,++有没有歧义 - 它总是意味着“增量”

因此,当您在一个字符串上运行++时,它会将其转换为数字。由于这在示例#2中没有发生,所以+操作都是连接。

var x = '1'; 
x++; 
alert(typeof x); // "number" 
1

原因是变量++会首先将变量转换为数字,然后将其增加1。虽然变量+ 1只会将1添加到变量,但不会将其转换。

1

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

"1" + 2 + 3; // -> "123" 
4 + 3 + "2"; // -> "72" ; 4 + 3 = 7 ; 7 + "2" = "72"