Я знаю, что версия регулярного выражения уже принята, но могу поспорить, что это "быстрее", чем выполнение этого комплекса регулярных выражений. String.replace
довольно быстро.
var isExternal = function(url) {
var domain = function(url) {
return url.replace('http://','').replace('https://','').split('/')[0];
};
return domain(location.href) !== domain(url);
}
Обновление
Я решил немного больше изучить это и нашел более быстрый метод, использующий регулярное выражение.
var isExternalRegexClosure = (function(){
var domainRe = /https?:\/\/((?:[\w\d-]+\.)+[\w\d]{2,})/i;
return function(url) {
function domain(url) {
return domainRe.exec(url)[1];
}
return domain(location.href) !== domain(url);
}
})();
В IE это немного быстрее, чем String.replace
метод. Однако в Chrome и Firefox это примерно в два раза быстрее. Кроме того, определение Regex только один раз внутри замыкания, а не только внутри функции, обычно примерно на 30% быстрее в Firefox.
Вот jsperf , исследующий четыре различных способа определения внешнего имени хоста.
Важно отметить, что каждый метод, который я пробовал, занимает менее 1 мс для запуска даже на старом телефоне. Таким образом, производительность, вероятно, не должна быть вашей основной задачей, если вы не выполняете какую-то большую пакетную обработку.