These are the bitwise operators, all supported in JavaScript: op1 & op2 -- The AND operator compares two bits and generates a result of 1 if both bits are 1; otherwise, it returns 0.
Bitwise works on the binary level, so 0 on binary would seen as 0000_0000, and (in two's complemented) -1 is 1111_1111, this not 0 flips all the bits to 1s, thus alters 0 into -1.
117 Bitwise operations, including bit shift, are fundamental to low-level hardware or embedded programming. If you read a specification for a device or even some binary file formats, you will see bytes, words, and dwords, broken up into non-byte aligned bitfields, which contain various values of interest.
Bitwise operations in programming languages play a fundamental role when dealing with a lot of applications. Almost all low-level computing must be done using this kind of operations. In all applications that need to send data between two nodes, such as: computer networks; telecommunication applications (cellular phones, satellite ...
Related: Bitwise operation and usage for bitwise boolean ops in general, pointing out that they do 32 (or 64 or whatever) separate bitwise boolean operations in parallel.
1 Is there any functional difference between logical and bitwise operators in the following case? Yes, there is (lazy eval as others have pointed out). Any reason to support one or the other? If somehow they were equivalent, the case for using logical operators would be to preserve the semantic intended by the type.
0 The single pipe, |, is one of the bitwise operators. From Wikipedia: In the C programming language family, the bitwise OR operator is "|" (pipe). Again, this operator must not be confused with its Boolean "logical or" counterpart, which treats its operands as Boolean values, and is written "||" (two pipes).