URL 对象

  1. 创建 URL 对象:new URL(url, [base])
  2. URL 组件
  3. 我们可以将 URL 对象传递给网络(和大多数其他)方法,而不是字符串

SearchParams “?…”

  1. url.searchParams,URLSearchParams 类型的对象。
  2. 包含空格和标点符号的参数:参数会被自动编码
  3.         
                // 遍历搜索参数(被解码)
                for(let [name, value] of url.searchParams) {
                  alert(`${name}=${value}`); // q=test me!,然后是 tbs=qdr:y
                }
            
        

编码(encoding)

  1. RFC3986 标准定义了 URL 中允许哪些字符,不允许哪些字符。
  2. 那些不被允许的字符必须被编码,例如非拉丁字母和空格 —— 用其 UTF-8 代码代替,前缀为 %,例如 %20(由于历史原因,空格可以用 + 编码,但这是一个例外)。
  3. 好消息是 URL 对象会自动处理这些。我们仅需提供未编码的参数,然后将 URL 转换为字符串:
  4. 正如你所看到的,url 路径中的 Тест 和 ъ 参数都被编码了。
  5. URL 变长了,因为每个西里尔字母用 UTF-8 编码的两个字节表示,因此这里有两个 %.. 实体(entities)。

编码字符串

  1. 在过去,在出现 URL 对象之前,人们使用字符串作为 URL。URL 对象通常更方便,但是仍然可以使用字符串。在很多情况下,使用字符串可以使代码更短。
  2. 如果使用字符串,则需要手动编码/解码特殊字符。下面是用于编码/解码 URL 的内建函数:
  3. 一个自然的问题:“encodeURIComponent 和 encodeURI 之间有什么区别?我们什么时候应该使用哪个?”如果我们看一个 URL,就容易理解了,它被分解为本文上面图中所示的组件形式:
  4. ……另一方面,对于 URL 的单个组件,例如一个搜索参数,则必须对这些字符进行编码,以免破坏 URL 的格式。
  5. 所以,对于一个 URL 整体,我们可以使用 encodeURI:
  6. ……而对于 URL 参数,我们应该改用 encodeURIComponent:
  7. 将其与 encodeURI 进行比较: