JSON响应中response.charAt(0)与"P"不相等的问题排查与解决
嘿,我帮你捋捋这个问题:你发现AJAX返回的字符串第一个字符看起来明明是"P",但和手动输入的"P"用==比较却返回false,可直接写"P" == "P"又正常返回true。这种情况基本不是数据类型的问题(毕竟charAt()返回的本来就是字符串),大概率是响应里藏着不可见的隐藏字符——比如UTF-8的BOM标记、开头的空格/换行,或者其他控制字符。
先确认问题根源
你可以先打印出字符的Unicode编码来实锤:
console.log(response.charAt(0).charCodeAt(0)); // 正常的"P"编码是80 console.log("P".charCodeAt(0)); // 这个肯定输出80
如果第一个输出不是80,那说明你取到的根本不是真正的"P",要么是前面有隐藏字符(比如BOM的编码是65279),要么是看起来像"P"的其他字符。
具体解决方案
针对这个问题,给你几个实用的处理方式:
先清理响应中的隐藏字符:在处理响应前,把开头的空白、BOM和控制字符都去掉:
// 用正则干掉开头的所有空白、BOM标记 const cleanedResponse = response.replace(/^\s+|^\uFEFF/, '');之后再用清理后的字符串做判断,就能正常匹配了。
养成用严格相等
===的习惯:虽然这次不是类型问题,但===会同时检查值和类型,能避免很多隐式类型转换的坑,比==更靠谱:if (cleanedResponse.charAt(0) === "P") { ... }检查后端返回的原始内容:有时候问题出在后端,比如返回的字符串前面不小心加了空格、换行,或者输出了BOM。你可以打开浏览器的开发者工具,在「网络」面板里查看这个请求的原始响应内容,确认有没有多余字符。
修正后的完整代码
$.ajax({ type: "POST", url: "/1/1", data: someData, }).done(function(response) { // 先清理响应里的隐藏字符 const cleanedResponse = response.replace(/^\s+|^\uFEFF/, ''); console.log("P" === "P"); // 必然返回true console.log("RESPONSE: " + cleanedResponse); // 打印清理后的内容 console.log("RESPONSE FIRST LETTER: " + cleanedResponse.charAt(0)); // 注意这里要加括号,不然会先拼接字符串再比较,结果不对! console.log("RESPONSE BOOL P :" + (cleanedResponse.charAt(0) === "P")); if (cleanedResponse.charAt(0) === "P") { console.log("1"); localStorage.setItem("error_msg_local", message); } else if (cleanedResponse.charAt(0) === "L") { localStorage.setItem("success_msg_local", message); console.log("2"); } else { localStorage.setItem("error_msg_local", "Internal error. Please try again."); console.log("3"); } });
哦对了,你代码里还有个小细节:console.log("RESPONSE BOOL P :" + response.charAt(0)=="P")这里的比较会因为优先级问题出错——JS会先把字符串拼接起来,再和"P"比较,所以结果肯定是false。要加个括号把比较部分包起来,就像上面代码里那样。
内容的提问来源于stack exchange,提问作者anon

