URL 接口是 web 接口,包含若干静态方法的对象,用来创建 URLs。
当使用一个没有实现该构造器的用户代理时,可以通过 window.URL 属性来访问该对象(比如小程序里面就只有 window.URL),对于没有 URL 的用户代理,可以使用第三方实现,比如:https://github.com/zloirock/core-js/blob/master/packages/core-js/web/url.js
基础使用参见:
https://developer.mozilla.org/zh-CN/docs/Web/API/URL/URL
https://developer.mozilla.org/zh-CN/docs/Web/API/URL
https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams
容易让人疑惑的点:
示例一,Chrome 浏览器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const obj = new URL('http://hostname/pathname?name=value#hash') console.log(obj);
hash: "#hash" href: "http://hostname/pathname?name=pages/main/index#hash" password: "" port: "" protocol: "http:" search: "?name=value" searchParams: URLSearchParams {} username: ""
host: "hostname" hostname: "hostname" pathname: "/pathname" origin: "http://hostname"
|
示例二,Chrome 浏览器,把 http 协议换成 scheme:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const obj = new URL('scheme://hostname/pathname?name=value#hash') console.log(obj);
hash: "#hash" href: "scheme://hostname/pathname?name=value#hash" password: "" port: "" protocol: "scheme:" search: "?name=value" searchParams: URLSearchParams {} username: ""
host: "" hostname: "" pathname: "//hostname/pathname" origin: "null"
|
示例三,Node.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const url = require('url'); const obj = url.parse('scheme://hostname/pathname?name=value#hash'); console.log(obj);
hash: '#hash', href: 'scheme://hostname/pathname?name=value#hash' protocol: 'scheme:', slashes: true, auth: null, port: null, search: '?name=pages/main/index', query: '?name=pages/main/index',
host: 'hostname', hostname: 'hostname', pathname: '/pathname', path: '/pathname?name=pages/main/index',
|
可以看出,这个 URL 的规范与其他实现里面的实现还是有区别的,whatwg 的 URL Standard 定义了几个 special-scheme:
https://url.spec.whatwg.org/#special-scheme
当你发现 URL 解析的结果不符合你的预期时,你需要的可能是 URI ,而不是 URL。=。=