我已经写了13年的JavaScript,但是我在过去的几个月里重新发现它作为一种编写程序的方式,任何访问网页的人都可以使用它而无需安装任何东西。请参阅example。
我最近发现的showstopper是因为JavaScript在设计上是松散类型的,所以当我希望它添加数字时,它会保持连接字符串。这是不可预测的。一个例程工作好几天然后当我输入不同的数据时,问题就出现了,我最终得到了一个不可思议的大数字。
有时候,通过将( )
放在一个词语中,我有幸阻止了这一点,有时我不得不在一个词上使用parseInt()
或parseFloat()
。它提醒我一点点试图通过在一个(常量)项上放置.00来强制将结果放入C中。我只是通过在所有内容上执行+=
来尝试parseFloat()
来自我已经加载的数组中的某些内容时发生了这种情况。
这是否仅在此外发生?如果我每次添加至少一个条款时使用parseInt()
或parseFloat()
,是否会阻止它?我在Linux下使用Firefox 6进行编写,但跨浏览器的可移植性也是一个问题。
答案 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'