使用Javascript not运算符时的奇怪结果

时间:2013-02-03 02:10:35

标签: javascript syntax bit-manipulation

在任何人跳进来回答并抨击我提出一个愚蠢的问题之前;我知道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的设置方式。

2 个答案:

答案 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),空函数,   空数组和空对象。

所以,你所看到的确实是预期的。