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

JSLint and my Javascript - Best practices on making this script conform

本文关键字:最佳 脚本 我的 Javascript JSLint      更新时间:2023-09-26

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

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

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

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"answers"123.-123"?

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

JSLint告诉您的是,正则表达式不应该说出不想要的东西,而应该定义想要的东西

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

我不太喜欢多次返回,如果我在null检查后return parseFloat(str);,JSLint会给你一个Unnecessary 'else' after disruption,所以让我们也放一个返回var。

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

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

我知道在你的特定情况下,这个规则有点过头了,但在更复杂的情况下,当你"不"^序列时,很容易让无意的匹配溜走。在那些更复杂的情况下,这个规则可以成为合乎逻辑的救命稻草。