Skip to content
字数
1287 字
阅读时间
6 分钟

URL 组成

URL

  • href 一个完整的 URL 地址
  • origin 由协议(protocol),域名(hostname),端口(post) 组成的源, 他是一个只读属性
  • protocol 协议, 常见的协议有 http https ftp, 协议表示我们可以通过不同的规则访问一个 URl,前提是服务器支持该协议
  • hostname 域名,或者说是主机名。
  • port 端口号, 一般 http 的端口为 80 ,而 https 的端口为 443
  • pathname 路径
  • search 路由参数 以 ? 开头
  • hash 哈希值 以 # 开头
  • 如果存在 HTTP 身份验证,则这里可能还会有 user 和 password 属性

创建 URL 对象

js
new URL(url, [base])
  • url --- 完整的 URL,或者仅路径(如果设置了 base)
  • base --- 可选参数,如果设置了两个参数,则会根据两参数生成一个完整的 Url

以下两个都是一样的值

js
const u1 = new URL('https://www.baidu.com/aa/bb')
const u2 = new URL('/aa/bb', 'https://www.baidu.com')
console.log(u1.href, u2.href)
// u1 -> https://www.baidu.com/aa/bb
// u2 -> https://www.baidu.com/aa/bb

看看 url 有哪些属性值: 发现这个内置对象 可以取出一个 URL 的所有属性,可以很方便的处理 URL

js
const u1 = new URL('https://www.baidu.com/aa/bb')
console.log(u1)
// {
//   hash: ""
//   host: "www.baidu.com"
//   hostname: "www.baidu.com"
//   href: "https://www.baidu.com/aa/bb"
//   origin: "https://www.baidu.com"
//   password: ""
//   pathname: "/aa/bb"
//   port: ""
//   protocol: "https:"
//   search: ""
//   searchParams: URLSearchParams {}
//   username: ""
// }

对于字符串的编码

URL 中的 合法字符

  • URL 元字符: 分号; 逗号, 斜杆/ 问好? 冒号: at 符@ and 符& 等于号= 加号 + 美元符 $
  • 语义字符: 井号# 连接符号 - 下划线 _ 点. 感叹号! 波浪号~ 星号 * 单引号 ' 圆括号 () 最后还有 大小写字母 a-z A-Z 和 阿拉伯数字 0-9

除了合法字符之外的字符,在 URL 被处理时都会提前进行转义

转义的规则是:根据操作系统的默认编码,将每个字节转为百分号(%)加上两个大写的十六进制字母

js
 <!-- cli.html -->
 <script>
  console.log(window.location.href)
  // http://localhost:8082/cli.html?a=VSA%20UIO
 </script>

手动编码方法

  • encodeURI 编码整个 URL
  • decodeURI 解码为编码前的状态
  • encodeURIComponent 编码 URL 组件,例如搜索参数,或者 hash,或者 pathname
  • decodeURIComponent 解码为编码前的状态

带 component 的方法相比不带的,转义对象不同

  • 带 component 的会转义【语义字符】之外的字符
  • 不带的会转义【非法字符】
txt
如果你想传一个参数 12&123 怎么办, 它会把 & 当成参数分隔符。 和你的本意不同,这样, 我们就是使用 encodeURIComponent 进行参数编码
js
const params = encodeURIComponent('12&123')
const url = `https://www.baidu.com:8080/path/page?p1=${params}&a=1`
console.log(url)
// https://www.baidu.com:8080/path/page?p1=12%26123&a=1

const arr = url.match(/([^&?])+(=)([^&])+/g)
console.log(arr)
//  ["p1=12%26123", "a=1"]

console.log(arr[0].split('='))
// ["p1", "12%26123"]


const p1 = arr[0].split('=')[1]
console.log(p1)
// 12%26123

console.log(decodeURIComponent(p1))
// 12&123

自动编码方法

URL 对象下面有个属性为 searchParams,使用它可以进行对参数的各种处理。

(提示: searchParams 其实是 URLSearchParams(window 下面的内置对象, 和 URL 对象一样) 的实例,两者的用法也是一样的)

  • append 方法: new URL(url).searchParams.append('p1', '12&123') 往 url 里添加 属性名为 p1, 属性值为 12&123 的参数,对于 属性值 该方法会自动进行编码。
  • get 方法: new URL(url).searchParams.get('p1') 从 url 里取出 属性名为 p1 的参数值, 该方法会自动进行解码
  • delete 方法: new URL(url).searchParams.delete('a') 从 url 里删除 属性名为 p1 的参数
  • has 方法: new URL(url).searchParams.has('p1') url 中是否有 p1 参数, 返回 true 或 false
  • set 方法: 有两种功能,,分别是 添加新参数 和 替换旧参数
    • new URL(url).searchParams.set('p2', '00000') 往 url 里添加 属性名为 p2,属性值为 00000 的参数
    • new URL(url).searchParams.set('p1', '11111') 从 url 将属性名为 p1 的属性值替换为 00000
  • getAll 方法: new URL(url).searchParams.getAll('p1') 相比get方法,返回数组
  • append 方法允许插入相同属性名甚至相同属性值参数, 但是使用 get 方法的时候只能取第一个 p1 的值。这个时候我们就需要 getAll 方法, 它会取出所有的 p1 的值

new URL(url).searchParams 本身就是一个迭代器,拥有 forEach 方法, 和数组的 forEach 方法一样的使用

URL 的静态方法

这两个静态方法是相辅相成的, 一个是在内存中创建 URL 对象, 一个是 在内存中释放 URL 对象

createObjectURL

  • 使用方法 window.URL.createObjectURL(object), 用于创建 URL 的 File 对象、Blob 对象或者 MediaSource 对象。

revokeObjectURL

  • 使用方法 window.URL.revokeObjectURL(objectURL), 用来释放一个之前已经存在的、通过调用 URL.createObjectURL() 创建的 URL 对象

转载

了解浏览器内置的URL对象

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写