我正在寻找另一种方法来进行isNaN测试
我的原始代码看起来像这样。代码有效,但我注意到num1更改了类型,这很丑陋
// example 1: num1 changes type
num1 = parseInt(str1, 10);
if isNaN(num1){num1=-1;}
我把它改成了这个,但是这个使用了重复的代码
// example 2: duplicate code
if (isNaN(parseInt(str1,10))){num1=-1;}
else {num1=parseInt(str1,10);}
起初我考虑添加一个额外的变量来存储parseInt(str1,10),但该变量也会改变类型,因此实际上与示例1相同。
是否有替代示例1或2?
通过更改类型我的意思是
console.log(typeof(isNaN("123"))); // boolean
console.log(typeof(isNaN("abc"))); // boolean
console.log(typeof(parseInt("123", 10))); // number
console.log(typeof(parseInt("abc", 10))); // number
console.log(typeof(Number("123"))); // number
console.log(typeof(Number("abc"))); // number
console.log(Number("123")); // 123
console.log(Number("abc")); // NaN
答案 0 :(得分:4)
首先,我建议parseInt()
不是最佳选择。例如:
var x = parseInt("123hello world how are you today?", 10);
将“x”设置为123并简单地忽略尾随垃圾。
如果你真的想避开中间临时值,你可以设置一种实用的方法:
function ifNumeric( s, f ) {
s = +s;
if (!isNaN(s)) f(s);
}
ifNumeric( someString, function( n ) { /* whatever, with "n" being a number */ } );
但这似乎有点极端。但无论如何请注意,在该示例中,+
运算符用于将变量的值强制转换为“数字”类型。您也可以使用“Number”构造函数,但不能使用构造函数:
var numeric = Number( someString );
如果字符串不是完全有效的数字而没有尾随垃圾,则其中任何一个都会给你一个NaN
。
编辑 - 如果您只想要一个安全的“给我一个号码”转换器:
function toNumber( value, ifGarbage ) {
value = +value;
return isNaN(value) ? ifGarbage : value;
}
var num1 = toNumber( str1, -1 );