axios源码日记(一)

helper文件夹

文件夹结构与对应功能

image

buildURL.js

主要知识点:encodeURI和encodeURIComponenthtml

涉及代码片断浏览器

function encode(val) {
  return encodeURIComponent(val).
    replace(/%40/gi, '@').
    replace(/%3A/gi, ':').
    replace(/%24/g, '$').
    replace(/%2C/gi, ',').
    replace(/%20/g, '+').
    //Using square bracket notation for URL params
    replace(/%5B/gi, '[').
    replace(/%5D/gi, ']');
}
复制代码

encodeURI

encodeURI : encodeURI函数经过将特定字符的每一个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码 (该字符的 UTF-8 编码仅为四转义序列,由两个 "代理" 字符组成)。app

在URI中,有一些字符会被%进行编码,维基百科中的介绍为:百分号编码(英语:Percent-encoding,又称:URL编码(英语:URL encoding)),是特定上下文的统一资源定位符 (URL)的编码机制. 实际上也适用于统一资源标志符(URI)的编码。也用于为application/x-www-form-urlencodedMIME准备数据,由于它用于经过HTTP的请求操做(request)提交HTML表单数据。函数

encodeURI忽略协议前缀('http://')和域名部分。ui

不会被编码的字符包括如下:编码

类型 包含
保留字符 ; , / ? : @ & = + $
非转义的字符 字母 数字 - _ . ! ~ * ' ( )
数字符号 #

其余字符都会被%进行编码,例如:中国ママ等非以上列举的字符。url

值得一提的是,URI的规范现遵循较新的标准RFC3986,包含的保留字符又增长了:spa

! * ' ( ) ; : @ & = + $ , / ? # [ ]代理

新增的 [] 是为IPv6而被保留的。所以,除了上述字符之外,URI中的其它字符必须用百分号编码。code

编码对应值
! # $ % & ' ( ) * + , / : ; = ? @ [ ]
%21 %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D

encodeURIComponent

encodeURIComponent()是对统一资源标识符(URI)的组成部分进行编码的方法。它使用一到四个转义序列来表示字符串中的每一个字符的UTF-8编码(只有由两个Unicode代理区字符组成的字符才用四个转义字符编码)。

乍一看是否是和encodeURI没啥区别呢~,可是这个API强调的是:“对URI组成部分进行编码的方法”,这个方法会转义除了字母、数字( ) . ! ~ * ' -和_以外的全部字符。包含上述介绍中的一些encodeURI不会进行转义的字符。 具体说这个两个方法以前有个结论:

  1. encodeURIComponent()适合用来编码咱们的URI的queryString部分,而后拼接到URI的其余部分。
  2. 若是使用encodeURIComponent()来对URI进行编码,那么它将不会用做一个有效URI
  3. 编码一个有效URI,请使用encodeURI
  4. 根据上述讲述,encodeURI不编码queryString或哈希值(#),所以,须要编码除协议和域名外的部分,使用若是使用encodeURIComponent()

使用

其实,咱们的常见问题是特殊字符和空格,有些时候没法避免在queryString中带有一些特殊字符(中文就是一种……),这个时候咱们就须要使用encodeURIComponent()来转义queryString,而后与URL的其余部分拼接起来。可是鉴于大多数浏览器会自动将空格等字符转换为%编码的URL编码值,但始终在一小部分浏览器中存在异常(IE会出现异常,重现率100%)。幸运的是,浏览器提供本机URL编码和解码功能:encodeURI,encodeURIComponent。那么,相应的,decodeURI,decodeURIComponent就是用来解码已经编码的内容的方法。
相关文章
相关标签/搜索