不能直接用 string.prototype.startswith() 的 context 参数来判定 url 原始协议,因为该方法根本没有 context 参数;正确方式是优先使用 new url(urlstr).protocol 提取协议,其次考虑正则匹配或谨慎配合 trim() 使用 startswith() 进行初步筛查。

不能直接用 String.prototype.startsWith() 的 context 参数来判定 URL 原始协议,因为该方法根本**没有** context 参数。
startsWith() 方法没有 context 参数
String.prototype.startsWith() 只接受两个参数:
-
searchString:要匹配的子字符串(如
"https:") -
position(可选):从哪个索引开始检查,默认为
0
它不接收也不支持所谓 context 参数。可能是混淆了其他 API(比如某些库的自定义方法、或误记了 Array.prototype.find() 的 thisArg)。
正确判断 URL 原始协议的方法
要安全、准确地提取或判定 URL 的原始协议(如 https:、http:、ftp:),推荐以下方式:
-
用 URL 构造函数解析:最可靠,自动处理各种边界情况(如带端口、编码、空格等)
const url = new URL("https://example.com"); console.log(url.protocol); // "https:" -
用正则匹配开头协议:适用于简单校验或无法使用
URL构造函数的环境(如旧浏览器或非浏览器 JS)const protocolMatch = urlStr.match(/^([a-z][a-z0-9+\-.]*):/i); const protocol = protocolMatch ? protocolMatch[1] + ":" : null; -
用 startsWith() 做初步快速筛查(仅限已知格式的干净字符串)
urlStr.startsWith("https:") || urlStr.startsWith("http:")—— 注意这只能判断“是否以某协议开头”,不能提取协议,也不能处理//开头的协议相对 URL 或无协议 URL。
为什么不能依赖 startsWith() 判定“原始协议”
因为协议信息可能不总在字符串开头:
-
//example.com是协议相对 URL,没有协议 -
data:text/plain,hello协议是data:,但不是网络协议 -
javascript:alert(1)是伪协议,startsWith("http:")会误判为 false -
https://example.com开头有空格,startsWith("https:")返回false,需先trim()
小结
别用不存在的 context 参数;要用标准、健壮的方式获取协议:
优先用 new URL(urlStr).protocol;若需兼容性,再考虑正则或谨慎使用 startsWith() 配合预处理(如 trim() 和标准化)。










