我有一些代码将字符串与数组中的值进行比较:
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()
没有检测到匹配?
答案 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'));

.includes()
(不适用于生产代码) .includes()
完全符合您的要求(返回Boolean true
/ false
进行完全匹配)。但是,它不像.indexOf()
那样generally available。建议不要在生产代码中使用它。对于数组,它不会比.indexOf(url) > -1
增加太多的好处。
Arrays还有许多其他可用于确定您匹配的方法。您使用的将取决于您的具体需求。与往常一样,您应该注意您选择使用的任何方法的兼容性问题。一些可用的方法是(text from MDN):
可以使用,但不太合适: