为什么我的代码没有检测到匹配?

时间:2017-03-04 23:49:29

标签: javascript

我有一些代码将字符串与数组中的值进行比较:

var blacklistedSites = ['https://www.google.com/_/chrome/newtab?espv=2&ie=UTF-8'];
//Returns true if the current site is blacklisted, false otherwise
function isBlacklistedSite(url) {
    console.log('Site is ' + url);
    blacklistedSites.forEach(function(entry) {
        console.log('testing ' + entry);
        if (entry == document.URL) {
            return true;
        }
    });
    return false;
}

console.log(isBlacklistedSite('https://www.google.com/_/chrome/newtab?espv=2&ie=UTF-8'));

输出:

Site is https://www.google.com/_/chrome/newtab?espv=2&ie=UTF-8
testing https://www.google.com/_/chrome/newtab?espv=2&ie=UTF-8
false

为什么isBlacklistedSite()没有检测到匹配?

1 个答案:

答案 0 :(得分:0)

您的代码无效的原因是:

return true;

实际上什么都不做。它只是从forEach函数返回,无论是否存在匹配,都会发生这种情况。您的return true;功能无法返回isBlacklistedSite()。您的isBlacklistedSite()函数始终退出:

return false;

虽然您可以使用.forEach()执行此操作,但这是一个糟糕的选择。无论您在.forEach()函数中提供任何返回值,forEach方法总是遍历数组的每个成员。如果您同时对阵列的每个元素进行其他操作,则只能使用它。即便如此,分开两个不同的任务可能会更好。如果您确实使用了它,则必须将检测保留在.forEach(function(){...外部定义的变量中。

使用.indexOf()测试与数组元素的完全匹配

如果要测试精确匹配数组元素,可以使用.indexOf()并测试值> -1。

例如:



var blacklistedSites = ['https://www.google.com/_/chrome/newtab?espv=2&ie=UTF-8'];
function isBlacklistedSite(url) {
    console.log('Site is ' + url);
    return blacklistedSites.indexOf(url) > -1;
}

//Test with a known matching value.
console.log(isBlacklistedSite(blacklistedSites[0]));
//Test with a known failing value.
console.log(isBlacklistedSite('foo'));




如果您需要更复杂的测试,可以使用.some()



var blacklistedSitesRegExes = [/(?:https?:)?\/\/[^/]*www\.google\.com\/.*espv=2/];
function isBlacklistedSite(url) {
    console.log('Site is ' + url);
    return blacklistedSitesRegExes.some(function(regex){
        regex.lastIndex = 0; //Prevent contamination from prior tests
        return regex.test(url);
    });
}

//Test with a known matching value.
console.log(isBlacklistedSite('https://www.google.com/_/chrome/newtab?espv=2&ie=UTF-8'));
//Test with a known failing value.
console.log(isBlacklistedSite('foo'));




使用limited availability.includes()(不适用于生产代码)

.includes()完全符合您的要求(返回Boolean true / false进行完全匹配)。但是,它不像.indexOf()那样generally available。建议不要在生产代码中使用它。对于数组,它不会比.indexOf(url) > -1增加太多的好处。

其他methods

Arrays还有许多其他可用于确定您匹配的方法。您使用的将取决于您的具体需求。与往常一样,您应该注意您选择使用的任何方法的兼容性问题。一些可用的方法是(text from MDN):

可以使用,但不太合适: