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です!ビットごとの演算子に相当しますか?

編集:2回目の試み

「!!」を使ってみた 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 の場合、出力は変化しません!!! それはまだ偽、真、偽です。何が起こっている?!

編集:3回目の試みで、変数と関係があることがわかりました。方法はわかりませんが、設定方法に関係しています。わかりました、準備してください。これからお話しすることは、あなたの心を吹き飛ばし、キーボードでの入力方法を変える可能性があります. それは信じられないほどです:

        //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

JavaScript では常に true である文字列として$.suggestBox.onOff設定されているようです。"0"

"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」は真実ですか?

より良いソースがあればいいのにと思います (サイトポイントは悪くありませんが、w3 ドキュメントほど信頼できるものではありません) が、http: //www.sitepoint.com/javascript-truthy-falsy/ によると

次の値は常に偽です。

間違い

0 (ゼロ)

"" (空文字列)

ヌル

undefined NaN (非数を意味する特別な Number 値!)

"0" (引用符で囲まれたゼロ)、"false" (引用符で囲まれた false)、空の関数、空の配列、空のオブジェクトなど、他のすべての値は true です。

したがって、あなたが見ているものは確かに期待されています。

于 2013-02-03T02:57:03.863 に答える