Global
[TOC]
索引
全局属性:
- globalThis:
object,ES2020,全局属性,用于跨环境统一访问全局对象。它解决了 JS 在不同运行环境中全局对象名称不一致的问题。
字符编码:
- encodeURI():
(uri),替代 escape(),用于对完整 URI进行编码的函数,遵循 UTF-8 编码标准,保留 URI 的合法字符(如协议、域名、路径中的/等)。 - decodeURI():
(encodedURI),替代 unescape(),用于解码通过 encodeURI() 编码的 URI的函数。保留 URI 的结构(如路径分隔符/、查询符?等),并支持 UTF-8 编码的字符解码。 - encodeURIComponent():
(str),替代 escape(),用于对 URI 组成部分(如查询参数、哈希值等)进行编码的函数。遵循 UTF-8 编码标准,会对更多字符(如/,?,=等)进行编码,适合处理 URL 的局部内容。 - decodeURIComponent():
(encodedURI),替代 unescape(),用于解码由 encodeURIComponent() 编码的字符串的函数。它专门处理 URI 组成部分(如查询参数、哈希值等),将转义序列还原为原始字符,支持 UTF-8 编码标准。 - escape():
(str),已废弃,用于将字符串编码成新的由十六进制转义序列替换的字符串。 - unescape():
(str),已废弃,用于解码通过escape()编码的字符串的旧方法。
Global
全局属性
globalThis
globalThis:object,ES2020,全局属性,用于跨环境统一访问全局对象。它解决了 JS 在不同运行环境中全局对象名称不一致的问题。
为什么需要 globalThis:
问题:在 ES2020 之前,访问全局对象在不同环境中需要使用不同的属性:
- 浏览器:
window - Node.js:
global - 严格模式:
undefined(无法直接访问) - Web Workers:
self - 浏览器框架:
frames - 独立 JS 引擎:无标准方式
解决方案:globalThis 提供了一种统一的方式访问全局对象,无论代码在什么环境中运行:
// 在任何环境中
console.log(globalThis); // 返回当前环境的全局对象
// 浏览器中
console.log(globalThis === window); // true
// Node.js 中
console.log(globalThis === global); // true
// Web Worker 中
console.log(globalThis === self); // true应用场景:
运行环境检测:
jsconst isNode = () => globalThis.process && globalThis.process.versions && globalThis.process.versions.node; const isBrowser = () => globalThis.window === globalThis;
字符编码
encodeURI()
encodeURI():(uri),替代 escape(),用于对完整 URI进行编码的函数,遵循 UTF-8 编码标准,保留 URI 的合法字符(如协议、域名、路径中的 / 等)。
uri:
string,要编码的完整 URI 字符串。可以是绝对 URL 或相对 URL。返回:
encodedURI:
string,返回一个新的字符串,其中非法字符被替换为 UTF-8 编码的十六进制转义序列。
语法特性:
不会被编码的字符:
textA-Z a-z 0-9 // 字母和数字 - _ . ! ~ * ' ( ) // 特殊符号 ; / ? : @ & = + $ , # // URI 保留字符(encodeURIComponent中会被编码)会被编码的字符:
- 空格 →
%20 - 非 ASCII 字符(如中文、Emoji)→ 多字节 UTF-8 编码(如
中→%E4%B8%AD) - 其他非法字符(如
"、{、})→ 对应的%XX或%XX%XX...形式。
- 空格 →
对比 encodeURIComponent():
encodeURI():保留 URI 的合法分隔符(如/,?,=,&,#),适合编码完整 URI。encodeURIComponent():编码更多字符(包括/, ?, =, &等),适合编码URI 的组成部分(如查询参数值)。
jsencodeURI("/path?name=John") // 返回 "/path?name=John"(保留 `/` 和 `?`) encodeURIComponent("/path?name=John") // 返回 "%2Fpath%3Fname%3DJohn"
示例:
基本编码:
js// 测试路径 -> %E6%B5%8B%E8%AF%95%E8%B7%AF%E5%BE%84 // 张三 -> %E5%BC%A0%E4%B8%89 // : / ? -> 被保留 encodeURI("https://example.com/测试路径?name=张三&age=20") // 返回 "https://example.com/%E6%B5%8B%E8%AF%95%E8%B7%AF%E5%BE%84?name=%E5%BC%A0%E4%B8%89&age=20"
decodeURI()
decodeURI():(encodedURI),替代 unescape(),用于解码通过 encodeURI() 编码的 URI的函数。保留 URI 的结构(如路径分隔符 /、查询符 ? 等),并支持 UTF-8 编码的字符解码。
encodedURI:
string,一个已编码的完整 URI 字符串(通常由 encodeURI() 生成)。返回:
uri:
string|URIError,- 解码成功:返回一个解码后的新字符串,将 encodeURI() 生成的转义序列还原为原始字符。
- 错误处理:包含无效的转义序列(如
%XX中XX非十六进制数,或%后不足两位字符),会抛出URIError。
语法特性:
解码规则:
- UTF-8 转义序列(如
%E4%B8%AD)→ 解码为对应 Unicode 字符(如中)。 - 保留字符(如
/,?,=,&,#)→ 保持原样,不进行解码。 - 非法转义序列(如不完整的
%XX或无效的 UTF-8 编码)→ 抛出URIError。
- UTF-8 转义序列(如
对比 decodeURIComponent():
decodeURI():仅解码由encodeURI()编码的字符,保留 URI 保留字符(如/,?,=)。decodeURIComponent():解码由encodeURIComponent()编码的字符串,包括 URI 保留字符(如/→%2F)。
jsdecodeURI("%2F") // 返回 "%2F"(不处理 `/` 的编码) decodeURIComponent("%2F") // 返回 "/"(解码 `/`)编码一致性:始终与
encodeURI()配对使用,避免与encodeURIComponent()混用。
示例:
基本解码:
- 路径
/path、查询符?、哈希符#未被解码。 %E5%BC%A0%E4%B8%89会被解码成张三。
jsdecodeURI("https://example.com/path?name=%E5%BC%A0%E4%B8%89&age=20#section") // 返回 "https://example.com/path?name=张三&age=20#section"- 路径
encodeURIComponent()
encodeURIComponent():(str),替代 escape(),用于对 URI 组成部分(如查询参数、哈希值等)进行编码的函数。遵循 UTF-8 编码标准,会对更多字符(如 /, ?, = 等)进行编码,适合处理 URL 的局部内容。
str:
string,需要编码的字符串(通常作为 URI 的一部分,如查询参数值)。返回:
encodedURI:
string,返回一个新的字符串,其中非法字符被替换为 UTF-8 编码的十六进制转义序列。
语法特性:
不会被编码的字符:
textA-Z a-z 0-9 // 字母和数字 - _ . ! ~ * ' ( ) // 特殊符号会被编码的字符:
- 空格 →
%20(而非+)。 - 非 ASCII 字符(如中文、Emoji)→ 多字节 UTF-8 编码(如
中→%E4%B8%AD)。 - 其他非法字符(如
{,},")→ 对应的%XX或%XX%XX...形式。 - URI 保留字符(如
/,?,=,&,#等)→ 转为%XX形式(encodeURI 中不会被编码)。
- 空格 →
对比 encodeURI:见 encodeURI()
处理
+和空格:encodeURIComponent()将空格编码为%20,而表单提交(application/x-www-form-urlencoded)中空格可能转为+。若需兼容表单格式,可手动替换:
jsencodeURIComponent("a b").replace(/%20/g, "+") // 返回 "a+b"
示例:
编码查询参数::
jsencodeURIComponent("name=张三&age=20") // 返回 "name%3D%E5%BC%A0%E4%B8%89%26age%3D20" // = → %3D,& → %26,张 → %E5%BC%A0处理特殊符号:
jsencodeURIComponent("Hello World! 😊") // 返回 "Hello%20World%21%20%F0%9F%98%8A" // 空格 → %20,! → %21,😊 → %F0%9F%98%8A编码路径片段:
jsencodeURIComponent("/path/to/file") // 返回 "%2Fpath%2Fto%2Ffile" // / → %2F
decodeURIComponent()
decodeURIComponent():(encodedURI),替代 unescape(),用于解码由 encodeURIComponent() 编码的字符串的函数。它专门处理 URI 组成部分(如查询参数、哈希值等),将转义序列还原为原始字符,支持 UTF-8 编码标准。
- encodedURI:
string,一个已编码的字符串(通常由 encodeURIComponent() 生成)。 - 返回:
- uri:
sring|URIError,- 成功解码:返回一个解码后的新字符串,将所有有效的转义序列还原为原始字符。
- 错误处理:包含无效的转义序列(如
%XX中XX非十六进制数,或%后不足两位字符),会抛出URIError。
语法特性:
解码规则:
- 转义序列解码:
- 单字节字符:
%XX(XX为两位十六进制数)→ 解码为对应的 ASCII 字符。 - 多字节 UTF-8 字符:
%XX%YY%ZZ...→ 合并为 UTF-8 编码的 Unicode 字符。
- 单字节字符:
- 保留字符解码:URI 保留字符(如
/,?,=)的编码会被还原。
- 转义序列解码:
编码一致性:始终与
encodeURIComponent()配对使用,避免与encodeURI()混用。错误处理:使用
try...catch处理可能抛出的URIError,尤其是在处理用户输入或外部数据时。jstry { decodeURIComponent("%GG"); // 无效的十六进制(GG 非合法) } catch (e) { console.error(e); // 抛出 URIError: URI malformed }处理
+和空格:- 表单提交(
application/x-www-form-urlencoded)会将空格转为+,而encodeURIComponent()转为%20。 - 若需兼容,可手动替换:
jsconst encoded = encodeURIComponent("a b").replace(/%20/g, "+"); // "a+b" const decoded = decodeURIComponent(encoded.replace(/+/g, "%20")); // 还原为 "a b"- 表单提交(
示例:
解码查询参数:
jsdecodeURIComponent("name%3D%E5%BC%A0%E4%B8%89%26age%3D20") // 返回 "name=张三&age=20" // %3D → =,%E5%BC%A0 → 张,%26 → &处理特殊符号:
jsdecodeURIComponent("%24%23%25") // 返回 "$#%" // %24 → $,%23 → #,%25 → %解码 Unicode 字符:
jsdecodeURIComponent("%F0%9F%98%8A") // 返回 "😊" // %F0%9F%98%8A -> 😊
escape()
escape():(str),已废弃,用于将字符串编码成新的由十六进制转义序列替换的字符串。
str:
string,要编码的字符串。返回:
str:
string,返回一个新的字符串,其中某些字符被替换为十六进制转义序列。具体规则如下:- 不转义的字符:ASCII 字母(
A-Z a-z)、数字(0-9)、以及特殊符号@*_+-./。 - 转义的字符:
- 其他字符会被替换为
%XX(XX是字符的十六进制码点,适用于码点小于0xFF的字符)。 - Unicode 字符(码点 ≥
0xFF)会被替换为%uXXXX(UTF-16 编码的码元)。
- 其他字符会被替换为
- 不转义的字符:ASCII 字母(
语法特性:
- 废弃原因:对 Unicode 字符处理不符合现代标准(如 UTF-8)。
- 替代方案:
示例:
基本字符:
jsescape('abc123@*-_+./') // 返回 "abc123@*-_+./"空格和符号:
jsescape('Hello World!') // 返回 "Hello%20World%21"Latin-1 字符:
jsescape('é') // 返回 "%E9"(假设字符编码为 Latin-1)Unicode 字符:
jsescape('α') // 返回 "%u03B1"(Unicode 码点 U+03B1) escape('😊') // 返回 "%uD83D%uDE0A"(UTF-16 代理对)
unescape()
unescape():(str),已废弃,用于解码通过 escape() 编码的字符串的旧方法。
str:
string,需要解码的字符串(通常由 escape() 编码生成)。返回:
str:
string,返回一个解码后的新字符串,将 escape() 生成的转义序列还原为原始字符。
语法特性:
解码规则:
%XX(XX为两位十六进制数)→ 解码为 Latin-1 字符(码点0x00到0xFF)。%uXXXX(XXXX为四位十六进制数)→ 解码为 Unicode 字符(UTF-16 码元)。- 其他字符(如字母、数字、保留符号)→ 保持不变。
废弃原因:
- 不支持 UTF-8 编码(仅支持 Latin-1 和 UTF-16)。
- 无法正确处理 URL 编码(如
+解码为空格、保留字符处理不一致)。
替代方案:
示例:
简单解码:
jsunescape("Hello%20World%21") // 返回 "Hello World!" unescape("%E9") // 返回 "é"(Latin-1 字符) unescape("%u03B1") // 返回 "α"(Unicode 字符)混合编码字符:
jsunescape("Name%3A%20%u5F20%u4E09") // 返回 "Name: 张三"%3A→:%20→ 空格%u5F20→张%u4E09→三
无法处理 UTF-8 编码:
jsunescape("%F0%9F%98%8A") // 返回 "😊"(错误解码,应为 "😊")%F0%9F%98%8A是😊的 UTF-8 编码,但unescape()按字节解码,导致乱码。