JavaScript中应优先检测并移除BOM头(str.replace(/^uFEFF/, '')),再针对性清洗控制字符、标准化Unicode、安全处理HTML实体,而非盲目过滤;不同用途需匹配不同清洗策略。

JavaScript 中的非标准字符串输入,比如包含不可见字符、编码不一致(如 UTF-8 与 Latin-1 混用)、BOM 头、多余空白、HTML 实体或转义序列等,容易引发解析错误、比较失败或安全问题。关键不是“过滤掉一切”,而是识别来源、明确用途、有针对性地清洗或转义。
识别并剥离 BOM 和控制字符
UTF-8 文件开头可能带 BOM(uFEFF),某些编辑器或后端响应会意外插入;ASCII 控制字符(如 u0000–u001F,不含空格、制表符、换行)常被用于隐藏注入或干扰解析。
- 用正则清除常见控制字符(保留空格、换行、制表符):
str.replace(/[u0000-u0008u000Bu000Cu000E-u001Fu007F-u009F]/g, '') - 检测并移除 BOM:
str = str.replace(/^uFEFF/, ''),建议在接收字符串后第一时间处理 - 注意:不要盲目用
trim()替代——它只去首尾空白,对中间的零宽字符(如u200B)无效
统一编码与规范化 Unicode
用户粘贴、跨平台复制、旧系统导出的数据,常含形似但码点不同的字符(如全角数字 1 vs 半角 1,或不同来源的重音字符)。使用 Unicode 标准化可提升一致性。
- 优先用
str.normalize('NFC')(兼容组合形式),适用于大多数显示和比对场景 - 若需彻底扁平化(如搜索、用户名校验),可结合替换:
str.normalize('NFD').replace(/[u0300-u036f]/g, '')去除变音符号 - 避免直接用
escape或encodeURI处理原始字符串——它们针对 URL 场景,会破坏可读性
安全处理 HTML 实体与转义序列
从富文本编辑器、API 返回或用户输入中拿到的字符串,可能含 &、< 或 e 这类实体。是否解码取决于后续用途。
立即学习“Java免费学习笔记(深入)”;
- 若用于 DOM 渲染(如
textContent),无需手动解码——浏览器自动处理,且更安全 - 若需还原为原始字符(如日志分析、数据清洗),可用临时 DOM 元素解码:
new DOMParser().parseFromString(`<div>${str}</div>`, 'text/html').documentElement.textContent - 警惕
eval、Function或innerHTML直接执行未清洗的字符串——即使已解码,也可能含恶意脚本
按用途选择清洗策略
没有“万能清洗函数”。同一字符串,在表单验证、URL 构造、JSON 序列化、正则匹配中,要求完全不同。
- 用于正则匹配前:先
normalize(),再确保特殊字符被正确转义(如str.replace(/[.*+?^${}()|[]\]/g, '\$&')) - 构造 URL 参数:用
encodeURIComponent(),而非encodeURI()或手动替换 - 存入数据库或 API 请求体:通常保持原始语义,由后端负责校验;前端只需确保 JSON 序列化不报错(
JSON.stringify自动处理大部分边界情况)


















