Почему так 👇



Для начала, с помощью Number явно преобразуем true и посмотрим, что у нас получится.



Очевидно, что будет вот так:

Number(true) // -> 1



Унарный оператор сложения «+» тоже пытается превратить значение в число. Он может преобразовывать строковые представления целых чисел и чисел с плавающей запятой, а также не строковые значения true, false и null.



Если он не может разобрать конкретное значение, то вычисляет его как NaN.



Поэтому мы можем преобразовать true в 1 вот так:

+true // -> 1



При сложении и умножении, JavaScript, с помощью вызова того же конструктора Number(argument), приводит argument к числу, что даёт нам: если argument равен true, то возвращается 1. Если argument равен false, то возвращается 0.



Поэтому мы можем складывать булевы значения как обычные числа и получать корректные результаты.