1

在有人跳进来回答并抨击我问了一个愚蠢的问题之前;我知道 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!等价于按位运算符?

编辑:第二次尝试

我尝试使用“!!” like 被建议(得到一个布尔值)并发现没有任何变化。这是代码和输出:

        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 的设置方式。

4

2 回答 2

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();
于 2013-02-03T02:57:37.073 回答
1

我认为你很困惑,因为你否定的是一个字符串,而不是一个数字。将字符串作为布尔值进行评估时,字符串有些不同,并且处理起来有些有趣。

!0

是真的,正如预期的那样。

!"0"

是假的......所以,问题是“0”是真的吗?

我希望我有一个更好的来源(sitepoint 还不错,但它不像 w3 文档那样权威),但是,根据http://www.sitepoint.com/javascript-truthy-falsy/

以下值总是虚假的:

错误的

0(零)

""(空字符串)

空值

undefined NaN(一个特殊的数字值,意思是非数字!)

所有其他值都是真值,包括“0”(引号中的零)、“false”(引号中的假)、空函数、空数组和空对象。

所以,你所看到的确实是意料之中的。

于 2013-02-03T02:57:03.863 回答