答案:JS中if(“true” == “true”) 结果当然为true。只是因为响应的数据最后带有回车“\n”,if(“true\n” == “true”) 结果当然为false啦。
该BUG特定的场景
后端:
在servlet中写了非常简短的代码,响应中返回布尔值true
response.setContentType("text/html, charset=utf-8");
response.getWriter().println(true);
前端:
在js中写了异步响应请求(这不重要),接收后端响应的数据(var val = xhr.responseText;)
<script>
var xhr;
function test() {
xhr = new XMLHttpRequest();
xhr.open("GET", "/date0813_war_exploded/equalTest.do", true);
xhr.onreadystatechange = callback;
xhr.send(null);
}
function callback() {
if (xhr.status === 200 & xhr.readyState === 4){
var val = xhr.responseText;
if (val){
alert("相等")
}else {
alert("不相等")
}
}
}
</script>
令人窒息的BUG们
记住:从后端返回的值存在 val 中
BUG一号选手
if (val)
无论我们后端传的是true还是false,if (val) 都是true,why?
我们输出一下val-----> true 或者是 false (后端传什么就输出什么)
我们输出一下typeOf(val)-----> String
原来这个问题在这,js并没有把传来的true和false当做布尔值,而是当作字符串了,而js中的if(字符串),只要字符串有值,不论字符串内容,if(字符串)都为true。
所以if (val) 行不通。
BUG二号选手
if (val == “true”)
无论我们后端传的是true还是false,if (val) 都是false,why?
我们输出一下val-----> true 或者是 false (后端传什么就输出什么)
我们输出一下typeOf(val)-----> String
我们输出一下val.length-----> 5
原来这个问题在这,只有4个字符的true的长度竟然为5,逐个输出true的字符后,发现最后一个字符为“\n”。
解决BUG
那么罪魁祸首就是response.getWriter().println(true);的println : 输出并换行!并!换!行!
解决方案一
改后端:将.println(); 改成print()
解决方案二
改前端:将if (val == “true”); 改成if (val.trim() == “true”)
总结
遇到BUG的时候真的觉得很神奇,感觉JS的if判断就很诡异,后来找到问题所在又觉得JS还是很正经的。挺有意思,所以记录下来。
在遇到这个有趣的bug的时候还学到一些有趣新知识,建议搜搜js if(0=="")返回ture的问题。