ChromeブラウザコンソールでこのJavaScript式の結果をテストしました(出力結果は太字です):
a = false
false
b = false
false
a || b
false
a | = b
0
最後の式(a | = b)でaが返されない理由ブール値?
更新:これを行うことはできますか?a = !!(a | = b)
ChromeブラウザコンソールでこのJavaScript式の結果をテストしました(出力結果は太字です):
a = false
false
b = false
false
a || b
false
a | = b
0
最後の式(a | = b)でaが返されない理由ブール値?
更新:これを行うことはできますか?a = !!(a | = b)
ビット演算子は、オペランドを 32 ビット (0 と 1) のセットとして扱い、標準の JavaScript 数値を返します。
mdnから取得
ブール値は返されませんが、割り当てられた変数の値と最後のステートメントは、の値をa
ブール値から整数に変更します。
操作タイプ 値 出力 アバブ a = false bool undefined false undefined false 1 b = false bool bool false false false 1 a || b bool bool false false false 2 a |= b integer bool 0 false 0 3
1最後に割り当てられた変数の値 (この場合a
、またはb
value を使用false
)。
2論理演算子||
(論理 OR) の値: false OR false === false
. これを少し単純化しましょう (やりすぎですか?) が、a
が false であるため、 の値が得られますb
。§ 11.11を見てください。
3ビット単位の演算子|
(ビット単位の OR、§ 11.10を参照)、仕様では、そのオペランドをその値(この場合はブール値) に評価してから、符号付き 32 ビット整数に変換する必要があり、結果は別の符号付き 32 ビット整数になります。§ 9.3から、ブール値から数値への変換で 0 が生成されることがわかっています。false
および 1 の場合、 § 9.5true
に従って 32 ビットの符号付き整数に変換されます (ここでも 0 になります)。
参考文献
JavaScript 言語仕様
|
はブール値ではなく、符号付き32ビット整数(数値)に作用するビット演算子だからです。false
したがって、演算子が適用される前に、ブール入力は最初にゼロにキャストされます。
また、論理OR演算子||
もブール値ではありません。短絡は、左(真の場合)または右の式の値に評価されます。これは、あなたの場合はブール型です。あなたが使用した場合var a=0, b=0
、それも同様に降伏0
します。