Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么URL类不支持为http以外的协议设置用户名?_Javascript_Url_Ecmascript 6_Browser - Fatal编程技术网

Javascript 为什么URL类不支持为http以外的协议设置用户名?

Javascript 为什么URL类不支持为http以外的协议设置用户名?,javascript,url,ecmascript-6,browser,Javascript,Url,Ecmascript 6,Browser,考虑以下代码: const url=新url('mumble://example.com'); url.username='user'; console.log(url.toString());//“印刷品”mumble://example.com" 但同样的代码适用于http: const url=新url('http://example.com'); url.username='user'; console.log(url.toString());//“印刷品”http://user@ex

考虑以下代码:

const url=新url('mumble://example.com');
url.username='user';
console.log(url.toString());//“印刷品”mumble://example.com"
但同样的代码适用于http:

const url=新url('http://example.com');
url.username='user';
console.log(url.toString());//“印刷品”http://user@example.com/“
我在文档中找不到关于这种行为的任何信息。我的目标解决方案很有趣:

const url=新url('mumble://example.com');
const protocol=url.protocol;
url.protocol='http:';
url.username='user';
url.protocol=协议;
console.log(url.toString());//“印刷品”mumble://user@example.com/“
有人能解释一下吗

编辑:有趣的是,只要协议不是http或https,URL类就不支持设置更多属性:

const url=新url('mumble://example.com');
const protocol=url.protocol;
url.username='user';
url.pathname='foo';
url.port=21;
url.protocol=协议;
url.host='foo.bar';
console.log(url.toString());//仍然mumble://example.com

并非所有方案都支持用户名。例如,
文件
没有。您的JS引擎显然假定未知方案不支持用户名。

Firefox和Chrome中的
URL
类不完全符合,因此您的问题的答案是
URL
类的规范允许这样做,但您运行代码的环境尚未遵循规范

例如,在节点14.x中运行示例代码会输出
mumble://user@example.com
正如您所希望的那样


您可以选择在您支持的环境中绕过当前行为,或者加载polyfill,这样您就可以按照预期使用
URL
API。

Firefox和Chrome上的行为相同。在更改URL的其他属性之前设置协议就像charm.JS引擎一样,与此无关,它是由whatwg定义的webAPI,也是由node实现的:它是一个环境问题。规范非常明确,任何不在中的方案都不能用作基本url,并且“如果url的主机为null或空字符串,设置了cannot-be-A-base-url标志,或者其方案为“file”,则url不能有用户名/密码/端口。”。因此,这完全是按照规范。Re“Js引擎与此无关”,除了您正在使用的引擎库之外…@kaido,Re“如果其主机为null或空字符串,则URL不能有用户名/密码/端口”,我看到了,但被询问的URL的主机既不是null也不是空字符串。。如果您可以显示规范认为
example.com
不是主机的位置,我会将其添加到我的答案中。不,它根本不是js引擎。。。是env。也就是说,它不是v8或spidermonkey,而是Blink和node或gecko。对于规范,请再次阅读我的评论,具有未在我提供的链接中列出的方案的url不能用作基本url,这是具有用户/密码/端口的先决条件。和