encodeURI 和 encodeURIComponent 区别
encodeURI、decodeURI、encodeURIComponent、decodeURIComponent 两对都可以用来编码和解码的 URI, 但是他们的区别又在哪里呢?
最近写的一个 nodejs 的 md5 库,在处理 URI 时使用的是 unescape() 函数, 而新版地 nodejs 在使用是又在提示 deprecated,MDN 文档 也标识为 Deprecated。于是考虑用 decodeURIComponent() 替换 unescape(),但发现还有命名相近的 encodeURI() 函数,命名近乎相似,于是找了些资料研究,而研究这些就得先开始对 URI 进行研究。
统一资源标识符, 或叫做 URI,是用来标识互联网上的资源(例如, 网页或文件)和怎样访问这些资源的传输协议(例如,HTTP 或 FTP)的字符串。除了 encodeURI、encodeURIComponent、decodeURI、decodeURIComponent 四个用来编码和解码 URI 的函数之外 ECMAScript 语言自身不提供任何使用 URL 的支持。
(注: escape() 和 unescape() 将被遗弃, 尽量不要使用)
URI 组成形式
一个 URI 是由组件分隔符分割的组件序列组成。其一般形式是:scheme: [// user:password @] host_ip [:port] [/] path [?search] [#others]。
例如:
- ftp://root:123456@127.0.0.1:3000/folder1/file1
- mailto:i@huiyifyj.cn
- https://github.com/search?l=JavaScript&q=uri&type=Repositories
上面这些都属于 URI,其中 : , / ; ? @ = + $ 等等都被当作分隔符的保留字符。
区别
encodeURI 和 decodeURI 函数操作的是完整的 URI,这俩函数假定 URI 中的任何保留字符都有特殊意义, 所有不会编码它们。
encodeURIComponent 和 decodeURIComponent 函数操作的是组成 URI 的个别组件,这俩函数假定任何保留字符都代表普通文本, 所以必须编码它们, 所以它们(保留字符)出现在一个完整 URI 的组件里面时不会被解释成保留字符了。
以上说明摘自 ECMAScript 标准,为了容易读懂做了点编辑加工。
ECMA 对这四个函数还做了详细解释,可能是为了写的更逻辑化一些,采用了类似变量配合逻辑的写法来说明,但是让初学者看得云里雾里的特别绕,所以有必要把它写得更像是人读的东西,例如下面的图解。

Reference links: