Javascript 当类型强制转换为布尔值时,REST API中0或1的任何值都返回true

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,所以我计

我在我的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

$(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"