JavaScript IF语句boolean strict

我通过将“truthy”布尔值传递给函数来在脚本中设置模式。 在函数中,一个简单的if语句检查param是true还是false 。 我有时将它作为一个字符串或一直使用的bool传递,但由于某种原因它不是为了这个:

 setMode: function(Setting) { if (Setting) { console.log('Enabling mode'); } else { console.log('Disabling mode'); } } 

例如,当我传递一个字符串'false'并将日志Setting为控制台时,控制台显示为false ,但if语句认为它是真的。

我必须将它添加到函数的开头才能工作:

if(typeof Setting ==’string’){Setting =(Setting ==“true”); }

它正在使用的一个例子:

 var inverted = $('INPUT[name="Mode"]').prop('checked'); app.setMode(inverted); 

另一个:

 var mode = localStorage.getItem('Mode'); this.setMode(mode); 

这是多么奇怪,因为我已经做了很多年这种事情,但它现在才开始。 也许是因为我使用localStorage.prop

如果你尝试记录'false' ,很明显控制台记录为false (它是一个字符串)并且if语句看起来是true ,因为非空字符串是一个真正的布尔值。

如果要检查字符串是"true"还是"false" ,则必须使用普通运算符。 所以你可以在函数的开头添加这一行:

 Setting = (typeof Setting === 'string') ? Setting === "true" : Setting; 

要回答有关字符串到布尔转换的问题:

ECMA规范:

如果参数为空String(其长度为零),则[转换]的结果为false; 否则结果是真的。

所以,是的,如果你传递字符串“false”,它将被转换为true ,这意味着你唯一的选择是手动检查字符串“true”或“false”并自己进行转换。

但是,jQuery函数.prop("checked")应该返回一个布尔值(如果undefined属性,则返回undefined )。 所以我会说你应该能够真正做到

 if (elem.prop("checked")) 

喜欢这里

例如,当我传递一个字符串'false'并将其记录到控制台时,控制台显示为false ,但if语句认为它是真的。

控制台输出令人困惑,它隐藏了引号并为字符串"false"和布尔值false都记录了false 。 然而,这两个并不相同,字符串不是空的,实际上是真的。

也许是因为我使用localStorage和.prop?

是。 .checked属性返回一个布尔值,一切运行良好。 相反, 本地存储只存储字符串 ,当你传入一个布尔值时,你会得到它的字符串化。 你可以通过使用来撤消它

 var modeStr = localStorage.getItem('Mode'); var mode = JSON.parse(modeStr); this.setMode(mode);