URL 和 URLSearchParams

1,292 阅读4分钟

在实际开发中,我们最常打交道的就是URL,而URL地址本质上就是一串特殊的字符串

而我们经常需要获取URL中的相关信息,直接去操作字符串是十分不方便的

所以浏览器为我们提供了URL对象和URLSearchParams对象以简化我们操作URL的方式

URLSearchParams

// 字符串头部的?是可以省略的
const queryStr = '?name=Klaus&age=25'
const queryArr = [['name', 'klaus'], ['age', 25]]
const queryObj = {
  name: 'Klaus',
  age: 25
}

// 可以通过URLSearchParams构造函数来创建查询对象实例
// 可以传入的参数类型为查询字符串,表示查询字符串的二维数组或用于描述查询字符串的对象
const searchParams1 = new URLSearchParams(queryStr)
const searchParams2 = new URLSearchParams(queryStr)
const searchParams3 = new URLSearchParams(queryObj)
console.log(searchParams1, searchParams2, searchParams3)

实例方法

方法说明
append添加新的键值对作为查询参数
如果存在重复的键,会新增值而不会覆盖
delete删除已存在的查询参数
get返回指定关键字对象的值
getAll以数组形式返回所有当前查询关键字对应的值
has返回布尔值,true或者false,是否包含某个查询关键字
entries返回查询参数们的迭代器对象,我们可以使用for-of 迭代该迭代器对象获得所有的键值对
keys返回一个迭代器对象,允许迭代该对象中所有的关键字
values返回一个迭代器对象,允许迭代该对象中所有的关键字值
forEach此方法可以遍历查询对象
set新增属性和属性值,有则覆盖,无则添加
sort按照key的Unicode码顺序进行升序排序
toString将URLSearchParams实例对象转换为对象的查询字符串
const searchStr = 'name=Klaus&age=23'
const searchParams = new URLSearchParams(searchStr)

// searchParams.entries方法 可以将 URLSearchParams实例转换为 可迭代对象
// 而在对URLSearchParams实例对象进行for-of方法的时候,会自动调用URLSearchParams实例的entries方法
// for (const [key, value] of searchParams) === for (const [key, value] of searchParams.entries)
for (const [key, value] of searchParams) {
  console.log(key, value)
}
const searchStr = 'name=Klaus&age=23'
const searchParams = new URLSearchParams(searchStr)

// URLSearchParams实例的entries形式和对象形式之间的相互转换

// URLSearchParams实例 -> entries
const entries = searchParams.entries()
console.log(entries)
// => URLSearchParams Iterator { [ 'name', 'Klaus' ], [ 'age', '23' ] }

// entries -> object
const obj = Object.fromEntries(entries)
console.log(obj) // => { name: 'Klaus', age: '23' }

// object -> URLSearchParams实例
console.log(new URLSearchParams(obj))
// => URLSearchParams { 'name' => 'Klaus', 'age' => '23' }

URL

URL接口用于解析、构造、规范化和编码URL。其构造的实例支持若干属性和方法,可以用来读写URL相关的属性值

// 参数1 - 相对地址或者绝对地址
// 需要设置base参数,如果是绝对地址,则会忽略base设置
// 如果url是URL实例对象,会自动调用toString方法转成字符串并作为参数值传入

// 参数2 - 如果URL地址是相对地址,则需要这个参数,作为baseUrl
// 如果url是URL实例对象,会自动调用toString方法转成字符串并作为参数值传入
// 默认值为空字符串
const base = 'https://www.example.com'
console.log(new URL('foo', base).href) // => https://www.example.com/foo
console.log(new URL('foo', base).toString()) // => https://www.example.com/foo
// URL在生成URL实例时,会自动将url和base进行拼接
let base = 'https://www.example.com/study/a/b/c'

console.log(new URL('sp/icon', base).href) // => https://www.example.com/study/a/b/sp/icon
console.log(new URL('./sp/icon', base).href) // => https://www.example.com/study/a/b/sp/icon

console.log(new URL('../sp/icon', base).href) // => https://www.example.com/study/a/sp/icon

// url链接地址以/结尾,所以上一层目录为study/a/b
console.log(new URL('../sp/icon', base + '/').href) // => https://www.example.com/study/a/b/sp/icon

// 如果第一个参数以/开头,那么就表示是绝对路径,其会替换原本的pathname
console.log(new URL('/sp/icon', base).href) // => https://www.example.com/sp/icon

// 没有协议的url认为是相对地址,协议取自base地址
// 生成的url地址如果没有pathname的时候,会自动以/结尾
console.log(new URL('//image.example.com', 'https://www.example.com').href) // => https://image.example.com/

// url为绝对地址,base参数被忽略
console.log(new URL('https://image.example.com', base).href); // => https://image.example.com/

属性

属性名属性值示例
href完整的URL地址www.example.com:8080/study/a/b/c…
host主机名 + 端口号www.example.com:8080
hostname主机名www.example.com
port端口号8080
protocol协议
以 : 结尾
https:
origin协议 + 主机名 + 端口号
唯一一个只读属性
www.example.com:8080
pathnameURL中的目录+文件名/study/a/b/c
search以?开头的查询字符串?name=Klaus
searchParams查询字符串对应的URLSearchParams实例对象

实例方法

URL有两个实例方法 toString()toJSON()

他们的功能是一致的,都是直接返回URL实例对象的href属性

静态方法

方法名功能
createObjectURL可以把File,Blob或者MediaSource对象变成一个一个唯一的blob URL
返回值是一个URL对象
revokeObjectURL撤消之前使用URL.createObjectURL()创建的URL对象
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <canvas id="canvas"></canvas>

    <script>
      const canvasEl = document.getElementById('canvas')
      
      // 将canvas对象 转换为以base64地址形式表示的链接
      const dataUrl = canvasEl.toDataURL()
      let blobUrl

      canvasEl.toBlob(blob => {
        // 将blob对象转换为对应的blob协议url
        blobUrl = URL.createObjectURL(blob)

        console.log(new URL(blobUrl))
      })
    </script>
  </body>
</html>