Javascript operadores lógicos y resultados

Sé que el resultado de las operaciones lógicas en la mayoría de los idiomas es verdadero, falso o 1,0. En Javascript probé lo siguiente:

alert(6||5)  // => returns 6
alert(5||6)  // => returns 5
alert(0||5)  // => returns 5
alert(5||0)  // => returns 5
alert(5||1)  // => returns 5
alert(1||5)  // => returns 1
alert(5&&6)  // => returns 6
alert(6&&5)  // => returns 5
alert(0&&5)  // => returns 0
alert(5&&0)  // => returns 0
alert(-1&&5) // => returns 5
alert(5&&-1) // => returns -1  

Entonces, ¿cuál es el resultado de los operadores lógicos? Si un operando es 0 o 1, entonces funciona como se espera. Si ambos son distintos de cero y distintos de 1, entonces

En caso de lógica.or, se devuelve el primer operando.En caso de lógica.and, se devuelve el segundo operando.

¿Es esta la regla general?

Otra cosa que no sé es el operador.|.

He probado el operador| Y obtuve diferentes resultados:

alert(5|8)  // => returns 13 
alert(8|5)  // => returns 13 
alert(-5|8) // => returs -5
alert(8|-5) // => returns -5
alert(0|1)  // => returns 1 
alert(1|0)  // => returns 1
alert(1|1)  // => returns 1

¿Qué hace realmente este operador?

Respuestas a la pregunta(2)

Su respuesta a la pregunta