Почему логический оператор в выражении возвращает вместо булевского значения строку?
Потому, что оператор && вычисляет слева направо каждый из своих операндов. Результат вычисление операнда приводится к булевому типу и если он true, переходит к вычислению следующего операнда. Операция повторяется до тех пор, пока результат вычисления очередного операнда не будет false, если это так, то возвращается результат вычисления данного операнда и цепочка обрывается.
Все операнды истины, значит цепочка дойдет до конца и вернет 51 && 2 && 3 && 4 && 5 // 5
В цепочке есть ложный операнд, значит он и вернется, а цепочка вычислений на нем закончится1 && 2 && 0 && 4 && 5 // 0
Цепочка завершится на том операнде для которого вы ответите отрицательно, последующие операнды не будут выполятьсяconfirm(1) && confirm(2) && confirm(3)
Для оператора || похожая картина. Отличие в том, что цепочка операндов будет выполняться до первого истинного операнда1 || 2 || 3 || 4 || 5 // 10 || false || !!0 || 5 || true || !!1 //5
Цепочка будет выполнятся до тех пор, пока вы не ответите истинноconfirm(1) || confirm(2) || confirm(3)
Т.е. по сути && и || не возвращают true или false. Они возвращают результат вычисления одного из своих операндов.
По ссылке из предыдущего ответа: https://learn.javascript.ru/logical-opsоператор && вычисляет операнды слева направо до первого «ложного» и возвращает его, а если все истинные – то последнее значение.