JSLint和我的Javascript - 使这个脚本符合的最佳实践

时间:2014-11-07 16:10:22

标签: javascript regex jslint

我放在一起的一个函数(运行但不在JSLint下验证)如下:

function toNumber(str)
{
 str = str.toString().replace(/[^0123456789.-]/g,'');
 if (str == "") {return 0;}
 return parseFloat(str);
}

这是为了获取任何给定的字符串并将其转换为一个数字,以便在我的javascript中的其他地方使用。示例运行如下:

toNumber(" 5")=> 5

toNumber(" 3,276")=> 3276

toNumber(" -14b396Z")=> -14396

这里的问题是当我尝试使用JSLint验证它时,我得到两个我无法解决的错误。

 line 25 character 36  str = str.toString().replace(/[^0123456789.-]/g,'');
  Insecure '^'.
 line 25 character 48  str = str.toString().replace(/[^0123456789.-]/g,'');
  Unescaped '-'.

我知道我可以在/ RegExp /"中打开"和[^ ...]忽略第一个错误,但仍然留给我第二个错误。解决这两个错误的最佳方法是什么?我想如果我要改写这个,不管怎么说,我不妨这两个错误,而不是只是对“不安全”这个问题视而不见。使用的本质^。

谢谢你, - Aaron Nichols

1 个答案:

答案 0 :(得分:0)

好的,首先,toNumber处理,比方说," 123.12.3"和" 123.-123"像你想要的那样?

但是,如果我们不担心这样的事情,只想复制你最初得到的东西,那就太难了。

JSLint告诉你的是一个正则表达式不应该说出你 想要的东西,而应该定义你做什么想要。

在这种情况下,真的很容易做到 。而不是说,"我想替换任何数字,点或破折号的东西,看看我是否还剩下任何东西",比如说,"我想要一切,从字符串的开头到结尾,再到 一个数字,点或短划线,或者我根本不想要一场比赛&#34 ;

我不是多次退货的忠实粉丝,如果Unnecessary 'else' after disruption检查后我return parseFloat(str);,JSLint会给你一个null,所以让我们放一下在返回var中。

/*jslint sloppy:true, white:true */
function toNumber2(str)
{
    var retVal = 0;
    if (null !== str.match(/^[0123456789.\-]+$/))
    {
        retVal = parseFloat(str);
    }
    return retVal;
}

所以我做得那么快,但我认为这和你最初想要的一样。

我理解这条规则在你非常具体的情况下有点矫枉过正,但当你没有"不是"时,很容易让无意识的比赛漏掉。 ^更复杂案例中的序列。在那些更复杂的情况下,这条规则可以成为一种合乎逻辑的救星。