简单明了区分escape、encodeURI和encodeURIComponent


Posted in Javascript onMay 26, 2018

一、前言

讲这3个方法区别的文章太多了,但是大部分写的都很绕。本文试图从实践角度去讲这3个方法。

二、escape和它们不是同一类

简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
编码之后的效果是%XX或者%uXXXX这种形式。
其中 ASCII字母、数字、@*/+ ,这几个字符不会被编码,其余的都会。
最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。
事实上,这个方法我还没有在实际工作中用到过,所以就不多讲了。

三、最常用的encodeURI和encodeURIComponent

对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
它们都是编码URL,唯一区别就是编码的字符范围,其中
encodeURI方法不会对下列字符编码  ASCII字母、数字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!*()'
所以encodeURIComponent比encodeURI编码的范围更大。
实际例子来说,encodeURIComponent会把 http://  编码成  http%3A%2F%2F 而encodeURI却不会。 

四、最重要的,我该什么场合用什么方法

区别上面说的很清楚了,接下来从实际例子来说说把。

1、如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
2、如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。

比如
encodeURI("https://3water.com/season-huang/some other thing");

编码后会变为

"https://3water.com/season-huang/some%20other%20thing";

其中,空格被编码成了%20。但是如果你用了encodeURIComponent,那么结果变为

"http%3A%2F%2F3water.com%2Fseason-huang%2Fsome%20other%20thing"

看到了区别吗,连 "/" 都被编码了,整个URL已经没法用了。

3、当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。

var param = "https://3water.com/season-huang/"; //param为参数
param = encodeURIComponent(param);
var url = "https://3water.com?next=" + param;
console.log(url) //https://3water.com?next=http%3A%2F%2F3water.com%2Fseason-huang%2F

看到了把,参数中的 "/" 可以编码,如果用encodeURI肯定要出问题,因为后面的/是需要编码的。

Javascript 相关文章推荐
jquery 插件实现图片延迟加载效果代码
Feb 06 Javascript
javascript自执行函数之伪命名空间封装法
Dec 25 Javascript
提交表单时执行func方法实现代码
Mar 17 Javascript
详解自动生成博客目录案例
Dec 09 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 Javascript
javascript函数的节流[throttle]与防抖[debounce]
Nov 15 Javascript
React Native中NavigatorIOS组件的简单使用详解
Jan 27 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
Sep 17 Javascript
js+springMVC 提交数组数据到后台的实例
Sep 21 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
Sep 21 Javascript
页面点击小红心js实现代码
May 26 #Javascript
js input输入百分号保存数据库失败的解决方法
May 26 #Javascript
使用javascript函数编写简单银行取钱存钱流程
May 26 #Javascript
jQuery插件jsonview展示json数据
May 26 #jQuery
jQuery插件Validation表单验证详解
May 26 #jQuery
jQuery创建及操作xml格式数据示例
May 26 #jQuery
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 #Javascript
You might like
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python如何读写csv数据
2018/03/21 Python
python实现textrank关键词提取
2018/06/22 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
商务日语毕业生自荐信
2013/11/23 职场文书
体育活动总结范文
2014/05/04 职场文书
公共场所标语
2014/06/30 职场文书
银行稽核岗位职责
2015/04/13 职场文书
企业百日安全活动总结
2015/05/07 职场文书
网络舆情信息简报
2015/07/21 职场文书
工作后的感想
2015/08/07 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android