在任何人跳进来回答并抨击我提出一个愚蠢的问题之前;我知道not运算符的作用,至少在其他语言中它应该将结果从true反转为false,反之亦然。我坚持的是我不时遇到的奇怪行为。即我的代码中有这个。它没有做我期望它做的事情。
_checkOnOff: function(inst) {
return (!$.suggestBox.onOff || !$.suggestBox._get(inst, 'onOff')) ? false : true;
},
我在这里处理的'onOff'变量的实际值是0和1.我假设'!'运营商将扭转它们。
然而,在我将函数更改为显式地声明'== 0'之前我无法工作......
_checkOnOff: function(inst) {
return ($.suggestBox.onOff == 0 || $.suggestBox._get(inst, 'onOff') == 0) ? false : true;
},
编辑:添加信息 $ .suggestBox.onOff和$ .suggestBox._get(inst,'onOff')将为0或1。
我的问题是为什么没有!$。在$ .suggestBox.onOff等于0时,suggestBox.onOff产生true?是Javascript!等价于按位运算符?
编辑:第二次尝试
我尝试使用'!!'喜欢被建议(获得一个博尔),并没有发现任何变化。这是代码和输出:
console.log('val: ' + $.suggestBox.onOff); // outputs: 0
console.log('! : ' + !$.suggestBox.onOff); // outputs: false
console.log('!! : ' + !!$.suggestBox.onOff); //outputs: true
console.log('!!! : ' + !!!$.suggestBox.onOff); //outputs: false
如果$ .suggestBox.onOff为1或0,则输出不会改变!它仍然是虚假的,真实的,错误的。发生了什么事?!
编辑:第三次尝试我发现它与我的变量有关。我不知道怎么做,但它与它的设置方式有关。好吧,准备好自己,我要告诉你的内容,可能会让你大吃一惊并改变你在键盘上打字的方式。这太不可思议了:
//this.onOff = 0;
console.log('this.onOff: ' + this.onOff); //output: 0
console.log('! : ' + ! this.onOff); //output: false
console.log('!! : ' + !! this.onOff); //output: true
如果我取消注释'this.onOff = 0',从而明确地将this.onOff分配给文字,它会将输出更改为:
我刚刚发现了原因。我会在答案部分写下来。小线索是,它是变量$ .suggestBox.onOff的设置方式。
答案 0 :(得分:2)
似乎$.suggestBox.onOff
设置为"0"
为字符串,在JavaScript中始终是真的。
由于"0"
是真实的而且0
是假的,所以你希望0 == "0"
是假的,但事实并非如此。
在控制台中尝试以下操作:
!! "0"; // true
!! 0; // false
0 == "0"; // true
奇怪?是。欢迎来到JavaScript的尴尬世界!
要解决此问题,您应该$.suggestBox.onOff
为实际号码,或者即时转换:
_checkOnOff: function(inst) {
return !! ( +$.suggestBox.onOff && +$.suggestBox._get(inst, 'onOff') );
}
更新:由于您在评论中指出您是通过文本值设置的,因此在设置时请使用此选项,以便始终将其设置为数字:
$.suggestBox.onOff = +$(this).val();
答案 1 :(得分:1)
我觉得你很困惑,因为你是在否定一个字符串,而不是一个数字。字符串有点不同,当它们作为布尔值进行评估时处理起来有点滑稽。
!0
正如预期的那样,是真的。
!"0"
是假的...所以,问题是“0” truthy ?
我希望我有一个更好的来源(sitepoint也不错,但它不像w3文档那样权威),但是,根据http://www.sitepoint.com/javascript-truthy-falsy/
以下值始终是假的:
错误
0(零)
“”(空字符串)
null
未定义 NaN(一个特殊的数字值,意思是非数字!)
所有其他值都是真实的,包括 “0”(引号为零),“false”(引号中为false),空函数, 空数组和空对象。
所以,你所看到的确实是预期的。