unescape 已被彻底移除,现代浏览器执行会抛出 ReferenceError;应根据编码来源选用 decodeURIComponent(对应 encodeURIComponent)或 decodeURI(对应 encodeURI),处理 %uXXXX 需手动兼容,Node.js 中应使用 URLSearchParams 或 decodeURIComponent 而非 querystring.unescape。

unescape 已被彻底移除,现代浏览器直接报 ReferenceError
在 ECMAScript 5(2009)中,unescape 就被标记为**废弃(deprecated)**;到 ECMAScript 2015(ES6)起,它被从标准中**正式删除**。现在所有主流浏览器(Chrome、Firefox、Safari、Edge)执行 unescape('abc') 都会抛出 ReferenceError: unescape is not defined。这不是兼容性问题,是语言层面的移除——你不能指望它“偶尔还能用”。
该用 decodeURIComponent 还是 decodeURI?看编码来源
unescape 原本对任何 %xx 形式都解码,不管是否符合 URI 编码规范,这导致它在处理中文、特殊符号时行为不一致且不安全。替代方案必须匹配编码方式:
- 如果你的字符串来自
encodeURIComponent(比如拼在 URL 查询参数里),必须用decodeURIComponent - 如果来自
encodeURI(比如整个 URL 路径或完整 URL),用decodeURI - 绝不要用
decodeURI去解encodeURIComponent的结果——会抛URIError
decodeURIComponent('%E4%BD%A0%E5%A5%BD'); // "你好"
decodeURI('%E4%BD%A0%E5%A5%BD'); // URIError: malformed URI sequence
decodeURI('https%3A%2F%2Fexample.com%2Fpath%3Fq=%E4%BD%A0'); // OK
遇到 legacy 字符串(含 %uXXXX)怎么办?自己写兼容解码
老系统可能输出类似 %u4F60%u597D(Unicode 转义),这是 IE 时代非标准写法,decodeURIComponent 完全不识别。需手动转换:
- 先用正则匹配
%u[0-9A-Fa-f]{4} - 用
parseInt(hex, 16)转成码点,再用String.fromCodePoint() - 注意:仅当确认输入含
%u才走此逻辑,避免污染正常 URI 解码
function decodeLegacy(str) {
return str.replace(/%u([0-9A-Fa-f]{4})/g, (_, hex) =>
String.fromCodePoint(parseInt(hex, 16))
);
}
decodeLegacy('%u4F60%u597D'); // "你好"
Node.js 环境下没有全局 unescape,但有人误用 querystring.unescape
Node.js v10+ 的 querystring 模块已弃用,其 unescape 方法实际等价于 decodeURIComponent,且模块本身被标记为 DEP0052。你应该:
立即学习“Java免费学习笔记(深入)”;
- 用内置
URLSearchParams解析查询字符串(推荐) - 或直接调用
decodeURIComponent,不依赖过时模块 - 避免在新项目中引入
querystring,尤其不要混用它的unescape和浏览器端逻辑
const params = new URLSearchParams('name=%E4%BD%A0&age=25');
console.log(params.get('name')); // "你好"
真正麻烦的不是选哪个函数,而是得先搞清原始字符串是怎么编码出来的——URI 编码、表单提交、JSON 序列化、还是某个古早 API 的私有格式。没看清源头就硬套 decodeURIComponent,反而容易解出乱码或触发异常。










