From what I get, you don't want to use location as the URL to subtract the port from, just any string as an URL. Well, I came up with this, for such a case. This function takes any string (but you can pass it the location URL anyway, and it works the same):
function getPort(url) {
    url = url.match(/^(([a-z]+:)?(\/\/)?[^\/]+).*$/)[1] || url;
    var parts = url.split(':'),
        port = parseInt(parts[parts.length - 1], 10);
    if(parts[0] === 'http' && (isNaN(port) || parts.length < 3)) {
        return 80;
    }
    if(parts[0] === 'https' && (isNaN(port) || parts.length < 3)) {
        return 443;
    }
    if(parts.length === 1 || isNaN(port)) return 80;
    return port;
}
- It gets the base url from the string.
- It splits the base url into parts, by ':'.
- It tries to parse the digits-only part of the port (the last element of the partsarray) into an integer.
- If the URL starts with 'http'AND the port is not a number or the length of the URL parts array is less than 3 (which means no port was implied in the URL string), it returns the default HTTP port.
- Same thing goes for 'https'.
- If the length was 1, it means no protocol nor port was provided. In that case or in the case the port is not a number (and again, no protocol was provided), return the defaultHTTPport.
- If it passes through all these tests, then it just returns the port it tried to parse into an integer at the beginning of the function.