Por que os operadores lógicos (&& e ||) sempre retornam um resultado booleano?

Por que esses operadores lógicos retornam um objeto e não um boolean

var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );

var _ = obj && obj._;

Quero entender por que ele retorna o resultado deobj.fn() (se estiver definido) ORobj._ mas não resultado booleano.

questionAnswers(8)

yourAnswerToTheQuestion