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的特殊符号,关于这点官方文档说的比较清楚,

javascript escape、encodeURI、encodeURIComponent_斜杠


因此?地址 中的 没有编码。

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的一部分编码。