我想解析包含经度和纬度的用户输入。我的目标是将字符串强制转换为数字,保留其符号和小数点位置。但当用户的输入无效时,我想显示一条消息。我应该遵循哪个方案?
parseFloat(x)
第二
new Number(x)
第三个
~~x
第四个
+x
parseFloat(x)
第二
new Number(x)
第三个
~~x
第四个
+x
如果我必须从这两个中选择一个的话,我会使用Number(x)
,因为它不允许出现末尾垃圾字符(trailing garbage)。虽然它实际上是“允许”的,但结果是一个NaN
。
也就是说,Number("123.45balloon")
是NaN
,但parseFloat("123.45balloon")
会作为数字返回123.45
。
正如Kling先生所指出的那样,哪个更“好”由您决定。
编辑 — 啊,你已经添加了+x
和~~x
。正如我在评论中写的那样,+x
等同于使用Number()
构造函数,但我认为它有一点风险,因为+
运算符的语法灵活性。也就是说,剪切和粘贴很容易引入错误。如果你知道你只需要一个整数(32位整数),那么~~x
形式是很好的选择。但对于纬度/经度来说,这可能不是你想要的。
+x
有什么看法? - M. Abbas+
:) 这个操作符的行为是明确定义的,但对于每个人来说可能并不明显它的意义/作用(类似于 ~~
)。 - Felix Kling+
的好处是速度快,这在我的答案链接中有所体现。 - Engineer+
可能比 Number
更快或更慢。可能在旧的浏览器中,+
更快,但现在不是这样了。 - Engineer~~x
会给你一个整数。~~x
这样的简洁技巧会降低代码的可读性,除非你真的因为某些原因(比如短的 JavaScript 编码竞赛)而非常紧张。而在你的情况下,~~x
甚至不是一个有效的解决方案,因为它只会给你一个整数。 - Ates Goral~~
不会让人困惑吗?我猜“困惑”取决于开发者... - elclanrsparseFloat()
的唯一问题是它会忽略数字后面的非数字字符。因此,一个以数字开头但以其他随机字符结尾的字符串仍然可以被解析,而且不会是 NaN
。当然,对于某些应用程序来说,这可能是可以接受的。 - PointyparseFloat("-42.42")
- Ates Goral+x
更短,并且使用它没有任何问题。(在括号中使用 (+x)
将解决语法问题,而且仍然比 Number(x)
更短 :-) - Pointy要测试是否为数字,请使用以下代码:
function isNumeric(obj){
return !isNaN( parseFloat(obj) ) && isFinite( obj );
}
将 String
转换为 Number
,使用 +
, 这是最快的方法:
一元运算符
+
也会将其操作数转换为数字,并且因为它不执行任何其他数学运算,所以它是将字符串转换为数字的最快方法。
因此,总体而言,您可能需要这样做:
if(!isNumeric(inputValue)){
alert('invalid number');
}else{
var num = +inputValue;
}
isNumeric
是从 jQuery
借用的
isNumeric
测试,那么 +x
的效率将变得无关紧要 :) 或许在转换后进行 isNaN(num)
检查会更好。 - Ates GoralisNaN
)并没有被证明过,而我发布的方式已经得到了证明。所以我会选择更可靠的方法。 - Engineervar d;
do {
d = prompt("Enter a number");
d = new Number(d);
} while( isNaN(d) );
document.write( d );
new Number(d)
始终会返回NaN
,而parseFloat(d)
将忽略尾随的无效字符。
new Number()
,如果需要则使用Number()
。这取决于您认为哪种类型的输入是有效的。例如,parseFloat
将接受"123foo"
并返回123
,但Number
(或一元的+
)将返回NaN
。 - Felix KlingNumber()
构造函数作为普通函数使用。 - Pointy