escape, encodeURI, encodeURIComponent

escape, encodeURI, encodeURIComponent是JavaScript内置的三个编码函数,
与之对应的解码函数分别为unescape, decodeURI, decodeURIComponent.

它们有什么区别与联系呢?


escape/unescape

这一对函数是建议不要使用的, 大家可以去w3c或者MDN自己去看, 至于为什么, 不是很清楚.
对 ASCII码而言(以下如未特殊说明,均指ASCII码范围),escape不编码的字符有69个 这可以通过如下代码来得出:

function notEncode(encodeMethod) {
    var arr = [];

    for (var i = 0; i < 256; i++) {
        var char = String.fromCharCode(i);
    
        if (char === encodeMethod(char)) {
            arr.push({
                character: char,
                escape: encodeMethod(char)
            });
        }
    }
    return arr;
}

// 以表格的形式打出来, 方便观看
console.table(notEncode(escape));

结果如下图(部分截图):

escape不编码的字符

而对于ASCII以外的字符,则会以%u + 十六进制数的形式来表示,如:

// "%u4E2D"
escape('中')

这一点在MDN中也有提及, 建议大家要查阅api都可以去MDN.

unescape就是用来解escape编码后的字符串的,但是也建议不要使用,
可以用decodeURI或者decodeURIComponent来代替.


知道了上述技巧, 那么我们可以轻松地知道, encodeURI不编码的字符有82个, encodeURIComponent不编码的字符有71个,
可以通过上述提供的函数来查看.


notice

实际中我们可能并不关心它们不编码的字符具体有哪些, 而是应用场景.
比如经常要对地址, 用户传递的参数(表单等)进行编码处理, 那么具体场景应该使用哪个函数呢?

之前我一直记得是, 参数编码就用encodeURIComponent, 对于URL地址, 不要协议+主机部分, 只用encodeURIComponent编其余部分, 其实这并不太对.
一般对于整个地址编码, 应该使用encodeURI, 对于参数(比如拼接地址时), 应该使用encodeURIComponent编.
比如:

var url = 'http://www.example.com/test space.html ';

// http://www.example.com/test%20space.html%20
var url_encodeURI = encodeURI(url);

// http%3A%2F%2Fwww.example.com%2Ftest%20space.html%20
var url_encodeURIComponent = encodeURIComponent(url);

由上述代码可见, encodeURIComponent会将/符号也进行编码, 这样编码后的地址就会访问失效.
对于参数的情况, 不再举例, 可参考这篇问答.


欢迎批评补充.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值