JSLint和我的Javascript—使此脚本一致的最佳实践

JSLint和我的Javascript—使此脚本一致的最佳实践,javascript,regex,jslint,Javascript,Regex,Jslint,我组合的一个函数(在JSLint下运行但不验证)如下所示: function toNumber(str) { str = str.toString().replace(/[^0123456789.-]/g,''); if (str == "") {return 0;} return parseFloat(str); } 这是为了获取任何给定的字符串并将其转换为一个数字,以便在我的javascript中的其他地方使用。示例如下所示: function toNumber(str) { st

我组合的一个函数(在JSLint下运行但不验证)如下所示:

function toNumber(str)
{
 str = str.toString().replace(/[^0123456789.-]/g,'');
 if (str == "") {return 0;}
 return parseFloat(str);
}
这是为了获取任何给定的字符串并将其转换为一个数字,以便在我的javascript中的其他地方使用。示例如下所示:

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

toNumber(“3276”)=>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/中的“and[^…]来忽略第一个错误,但这仍然会留下第二个错误。解决这两个错误的最佳方法是什么?我想如果我无论如何都要重写这篇文章的话,我最好对这两个错误都重写,而不是对使用^的“不安全”性质视而不见

谢谢,,
-Aaron Nichols

好的,那么,首先,toNumber是否按照您的意愿处理,比如说,“123.12.3”和“123.-123”

但如果我们不担心这样的事情,只想复制你最初得到的东西,这并不太困难

JSLint告诉您的是,正则表达式不应该说您不想要什么,而应该定义您想要什么。

在这种情况下很容易做到。不要说,“我想替换不是一个数字、点或破折号的任何东西,看看我是否什么都没有了”,而是说,“我想所有东西,从字符串的开头到结尾,都是一个数字、点或破折号,否则我根本不想匹配”

我不太喜欢多重返回,如果我
返回parseFloat(str),JSLint会在中断后给你一个
不必要的'else'null
之后的code>,所以让我们也输入一个返回变量

/*jslint sloppy:true, white:true */
function toNumber2(str)
{
    var retVal = 0;
    if (null !== str.match(/^[0123456789.\-]+$/))
    {
        retVal = parseFloat(str);
    }
    return retVal;
}
所以我做得有点快,但我认为这和你最初想要的是一样的


我知道这条规则在你非常特殊的情况下有点过分,但在更复杂的情况下,当你“不”一个序列时,很容易让无意的匹配漏掉。在那些更复杂的情况下,这个规则可能是一个合乎逻辑的救星。

只需使用一个更明智的工具,比如。它是由我对他们的心理稳定性有更大信心的人设计的。如果破折号/连字符是字符类中的第一个字符,那么所有的正则表达式引擎都会将其视为非特殊字符。