escape
根据MDN所说,已经废弃,不再推荐使用,所以就不再说了。
encodeURI
比如你有一个完整的uri,http://www.mydomain.com?name=名字&address=?地址
,很明显名字、地址两个是需要编码的,因为这是一个完整的uri,那么就用encodeURI。
let uri = "http://www.mydomain.com?name=名字&address=?地址"
encodeURI(uri)
'http://www.mydomain.com?name=%E5%90%8D%E5%AD%97&address=?%E5%9C%B0%E5%9D%80'
可以看到像冒号、斜杠、问号、等号、&符号等都没有编码,因为他们都是用来分割uri的特殊符号,关于这点官方文档说的比较清楚,
因此?地址
中的 ?
没有编码。
encodeURIComponent
类似上边的例子,比如你有个参数值名字,要将它拼到一个uri上,它们是uri的一部分,那么就需要encodeURIComponent。
let fragment = "http://www.mydomain.com?name="+encodeURIComponent("?名字")
'http://www.mydomain.com?name=%3F%E5%90%8D%E5%AD%97'
可以看到?
也被编码了,因为它是拼成uri的一部分。
总结
- 如果有一个完整的uri,你想处理其中的特殊字符,那么就用encodeURI,它会保留冒号、斜杠、问号等uri分隔符,就用
- 如果是uri的一部分,要将它拼到uri中,比如是参数值或者参数名,那么就要用encodeURIComponent
- 这两个到底用哪个从函数名字也能区分出来,encodeURI是对uri编码的;而encodeURIComponent是对uri的component也就是uri的一部分编码。