为何parseInt对看似正常的数字字符串返回NaN?
问题原因及解决方法
核心原因
你看到的JSON里的"x""y"字符串,表面是数字,但实际包含了肉眼不可见的Unicode控制字符(比如右至左嵌入符U+202B、弹出方向格式化符U+202C这类)。这些字符会干扰JavaScript的数字解析逻辑,导致parseInt/Number等方法无法识别出有效数字,最终返回NaN。
验证方式
你可以把字符串拆成单个字符,打印它们的Unicode编码来确认:
const str = obj.x; console.log(Array.from(str).map(c => `0x${c.charCodeAt(0).toString(16)}`));
执行后会看到除了数字对应的编码(比如0x31、0x32),还有额外的非数字编码,这些就是捣乱的隐藏字符。
解决办法
- 清理字符串再转数字
用正则替换掉所有非数字和负号的字符,或者直接匹配常见的隐藏控制字符:
// 方案1:保留数字和负号,去掉其他所有字符 const cleanX = parseInt(obj.x.replace(/[^\d-]/g, ''), 10); const cleanY = Number(obj.y.replace(/[^\d-]/g, '')); // 方案2:精准移除常见的零宽/方向控制字符 const controlCharsRegex = /[\u200B-\u200D\uFEFF\u202B\u202C]/g; const cleanX = parseInt(obj.x.replace(controlCharsRegex, ''), 10);
- 从源头避免
如果这份JSON是其他系统生成的,要检查生成逻辑,确保输出的数字字符串是纯文本格式,没有额外的格式控制字符混入。
内容的提问来源于stack exchange,提问作者fduayer
相关产品推荐
相关产品推荐

