简单明了区分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 & json的省市区联动代码
Jun 26 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
Jan 04 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
JS实现自动变化的导航菜单效果代码
Sep 09 Javascript
基于jQuery实现点击弹出层实例代码
Jan 01 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
May 17 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 Javascript
vue使用video插件vue-video-player详解
Oct 23 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强制下载类型的实现代码
2011/04/21 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
php实现httpclient类示例
2014/04/08 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
Javascript的一种模块模式
2010/09/08 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
使用Python编写vim插件的简单示例
2015/04/17 Python
Python中实现三目运算的方法
2015/06/21 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
Python中的asyncio代码详解
2019/06/10 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
Python 求向量的余弦值操作
2021/03/04 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
what is the difference between ext2 and ext3
2015/08/25 面试题
自荐信的五个重要部分
2013/10/29 职场文书
六一儿童节主持词
2014/03/21 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
员工升职自荐信
2015/03/27 职场文书
升学宴来宾致辞
2015/07/27 职场文书
股东协议书范本2016
2016/03/21 职场文书