Operadores e resultados lógicos de Javascript

Eu sei que o resultado de operações lógicas na maioria das linguagens é verdadeiro, falso ou 1,0. Em Javascript tentei o seguinte:

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  

Então, qual é o resultado de operadores lógicos? Se um operando for 0 ou 1, funcionará como esperado. Se ambos forem diferentes de zero e outros que não 1

Em caso de lógicoor, o primeiro operando é retornadoEm caso de lógicoand, o segundo operando é retornado

Esta é a regra geral?

Outra coisa que eu não sei é o operador|.

Eu tentei o operador| e obteve resultados diferentes:

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

O que esse operador realmente faz?

questionAnswers(2)

yourAnswerToTheQuestion