2

我有这段代码,我找不到任何解释。当我搜索 decodeURIComponent 时,它说它是 encodeURIComponent 的反面,但是,我在代码中的任何地方都找不到 encodeURIComponent。

getParameterByName = (name, url) => {
    if (!url)
       url = window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`),
    results = regex.exec(url);
    if (!results)
        return null;
    if (!results[2])
        return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

这是 URL http://localhost:8000/restaurant.html?id=2

那么,有人可以为我解释一下这段代码。

4

1 回答 1

1

正如 RFC 3986 中定义的那样,URI 只能包含字符-_.~a-zA-Z0-9and :/?#[]@!$&'()*+,;=,其中后一组具有一些特殊含义。通过限制为这些字符,URL 被清楚地分隔(通常由空格或换行符)并且可以通过代理和其他无法处理非 ASCII 字符的服务来生存。

如果您填写 GET 表单,则会对用户输入进行编码。例如,如果你用 google 搜索Hellö Lädies&Gentlemen+Bob,浏览器会请求

https://www.google.com/search?q=Hell%C3%B6+L%C3%A4dies%26Gentlemen%2BBob

您会看到所有非 ASCII 字符和与号 (&) 已使用百分号和UTF-8 编码中的字符的十六进制表示进行编码

空格字符的处理方式不同;因为它在用户输入中常见,所以它被分配了较短的字符+。这意味着+也必须进行百分比编码,如%2B.

name您拥有的代码从 URL中提取 GET 参数。如果它在那里,最后一行

return decodeURIComponent(results[2].replace(/\+/g, ' '));

首先将空格的编码撤消为+.

decodeURIComponent然后用于获取 name 参数的值。例如,如果用户输入的名称为René Müller&勒内穆勒,浏览器将发送name=Ren%C3%A9+M%C3%BCller%26%E5%8B%92%E5%86%85%E7%A9%86%E5%8B%92,并decodeURIComponent产生原始输入(自己尝试):

> decodeURIComponent('Ren%C3%A9 M%C3%BCller%26%E5%8B%92%E5%86%85%E7%A9%86%E5%8B%92')
'René Müller&勒内穆勒'
于 2018-03-15T08:06:40.450 回答