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);