在有人跳出来回答我并问我一个愚蠢的问题之前,我很生气;我知道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分配给文字,它将输出更改为:


0
真正



我才发现原因。我会在答案部分写下来。一个小提示是设置$ .suggestBox.onOff变量的方式。

最佳答案

看来$.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();

08-15 22:27