防止连接

时间:2011-10-16 14:06:43

标签: javascript

我已经写了13年的JavaScript,但是我在过去的几个月里重新发现它作为一种编写程序的方式,任何访问网页的人都可以使用它而无需安装任何东西。请参阅example

我最近发现的showstopper是因为JavaScript在设计上是松散类型的,所以当我希望它添加数字时,它会保持连接字符串。这是不可预测的。一个例程工作好几天然后当我输入不同的数据时,问题就出现了,我最终得到了一个不可思议的大数字。

有时候,通过将( )放在一个词语中,我有幸阻止了这一点,有时我不得不在一个词上使用parseInt()parseFloat()。它提醒我一点点试图通过在一个(常量)项上放置.00来强制将结果放入C中。我只是通过在所有内容上执行+=来尝试parseFloat()来自我已经加载的数组中的某些内容时发生了这种情况。

这是否仅在此外发生?如果我每次添加至少一个条款时使用parseInt()parseFloat(),是否会阻止它?我在Linux下使用Firefox 6进行编写,但跨浏览器的可移植性也是一个问题。

4 个答案:

答案 0 :(得分:8)

我通常这样做:

var x = 2;
var t = "12";
var q = t+x; // q == "122"
var w = t*1+x; // *1 forces conversion to number w == 14

如果t不是数字,那么您将获得NaN

如果乘以1个变量,则不知道它们是什么类型。它们将被转换为数字。我发现这种方法比使用int和float强制转换更好,因为* 1适用于各种数字。

您遇到的问题是从DOM获取值的函数通常会返回字符串。即使它是一个数字,当你获取它时它将被表示为一个字符串。

答案 1 :(得分:8)

The specification says about the addition operator

  

如果Type( lprim )是String或Type( rprim )是String,那么
      返回串联ToString( lprim )后跟ToString( rprim

的结果的字符串

这意味着如果至少有一个运算符是字符串,则会发生字符串连接。

  

如果我每次添加至少一个条款时使用parseInt()parseFloat(),是否会阻止它?

不,所有操作数都必须是数字。

您可以使用unary plus operator轻松地将任何数字字符串转换为数字(如果您已经在处理数字,则不会更改数值):

var c = +a + +b;

答案 2 :(得分:3)

您可以使用+运算符将字符串转换为数字。

var x = '111'
+x === 111

答案 3 :(得分:1)

请放心,这是非常可预测的,您只需要熟悉操作符和输入的数据类型。

简而言之,评估是从左到右,无论操作的哪一方,只要存在字符串,就会发生连接。

例如:

9 + 9 // 18
9 + '9' // '99'
'9' + 9 // '99'
+ '9' + 9 // 18 - unary plus
- '9' + 9 // 0 - unary minus

一些三元表达式:

9 + '9' + 9 // '999'
9 + 9 + '9' // '189'