后端响应的字符串“true”,在JS中不等于“true”?JS中if(“true“ == “true“),结果为false?

本文讲述了在前后端交互过程中,由于后端返回的布尔值被当作字符串处理导致的两个JavaScript BUG。问题在于`println()`方法在响应中添加了换行符,前端在判断时出现错误。解决方案包括后端修改为`print()`或前端使用`trim()`处理。此外,文章强调了理解JS中if判断及类型转换的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

答案: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的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值