Javascript 当类型强制转换为布尔值时,REST API中0或1的任何值都返回true
我在我的web应用程序中遇到了一个关于布尔运算的奇怪问题。我有一个服务,对Javascript 当类型强制转换为布尔值时,REST API中0或1的任何值都返回true,javascript,boolean,Javascript,Boolean,我在我的web应用程序中遇到了一个关于布尔运算的奇怪问题。我有一个服务,对true和false响应1和0。我调用的REST API(内部API)仅发送以下输出: GET /stuff/id/5 0 基于服务器的上述输出,我在前端使用了一个切换开关来检查makeitswitchon或off。其代码是: $(this).find(".toggle").toggles({ "on": requestContent }); 我知道有时候,1和0可能不会被解释为布尔值true或false,所以我计
true
和false
响应1
和0
。我调用的REST API(内部API)仅发送以下输出:
GET /stuff/id/5
0
基于服务器的上述输出,我在前端使用了一个切换开关来检查makeitswitchon或off。其代码是:
$(this).find(".toggle").toggles({
"on": requestContent
});
我知道有时候,1
和0
可能不会被解释为布尔值true或false,所以我计划使用
强制将它们转换为true
和false
$(this).find(".toggle").toggles({
"on": !!requestContent
});
但是,令我沮丧的是,它显示了所有开关都在ON位置,而不是正确的方式。不知何故,对于1
和0
的值,它只转换为true
我甚至尝试在这里制作一个模拟版本的服务器调用和我的前端,它完全复制了这个问题:
$(函数(){
//模拟HTTP响应。
变量状态=[“1”、“0”、“0”、“1”、“1”];
//该循环遍历所有值并设置开关的状态。
$(“.toggle”)每个(函数(i){
$(此)。切换({
“on”:!!表示[i]
});
});
});代码>
body{背景色:#f5;}
ul,li{margin:0;padding:0;列表样式:none;}
ul{宽度:150px;边距:自动;背景色:fff;填充:10px;边框半径:3px;边框:1px实心#eee;}
ul li{padding:10px;}
李鹏,
切换{宽度:50px;显示:内联块;垂直对齐:中间;}
ul li span{宽度:75px;线宽:1;}
-
项目1
-
项目2
-
项目3
-
项目4
-
项目5
主要问题是JavaScript类型转换的方式完全不同。换句话说,经过一个小时的调试,我发现问题在于JavaScript将字符串视为真实值的方式
当服务器响应时,响应总是以string
类型给出。带有0
(实际上是“0”
)的字符串需要类型转换为布尔false
。相反,JavaScript将其视为非空字符串
,并将其视为真实值
让我们考虑我在控制台上运行的代码。< /P>
» if ("0") "Yes"; else "No";
« "Yes"
在这里,我们可以清楚地看到“0”
字符串值被视为true
或正确的truthy值。因此,当非空字符串不被视为false
时,带有“0”
的字符串也不被视为false
$(this).find(".toggle").toggles({
"on": !!requestContent
});
解决办法
解决此问题的最佳方法之一是使用与0
的比较。考虑控制台上的以下指令:
» "0" == 0
« true
为了检查正确的值,比较运算符帮助我们将字符串“0”
与整数0
进行比较,它可以工作。同时,令人吃惊的是,字符串“0”
的类型转换为true
第二种方法是使用parseInt()
。只有当我们确信输出是一个整数值而不是其他值时,才应该使用这个函数。我们还可以添加isNaN()
作为异常处理机制,但这样做太过分了
» if (parseInt("0")) "Yes"; else "No";
« "No"
解决方案
现在,最好的解决方案是使用parseInt()
,因为我肯定该服务不会返回除1
或0
以外的任何其他值
$(函数(){
//模拟HTTP响应。
变量状态=[“1”、“0”、“0”、“1”、“1”];
//该循环遍历所有值并设置开关的状态。
$('.toggle')。每个(函数(i){
$(此)。切换({
//现在这一切都很好!;)
“on”:parseInt(状态[i])
});
});
});代码>
body{背景色:#f5;}
ul,li{margin:0;padding:0;列表样式:none;}
ul{宽度:150px;边距:自动;背景色:fff;填充:10px;边框半径:3px;边框:1px实心#eee;}
ul li{padding:10px;}
李鹏,
切换{宽度:50px;显示:内联块;垂直对齐:中间;}
ul li span{宽度:75px;线宽:1;}
-
项目1
-
项目2
-
项目3
-
项目4
-
项目5
很好的解释
» if (parseInt("0")) "Yes"; else "No";
« "No"