Почему так 👇
Для начала, с помощью Number явно преобразуем true и посмотрим, что у нас получится.
Очевидно, что будет вот так:
Унарный оператор сложения «+» тоже пытается превратить значение в число. Он может преобразовывать строковые представления целых чисел и чисел с плавающей запятой, а также не строковые значения true, false и null.
Если он не может разобрать конкретное значение, то вычисляет его как NaN.
Поэтому мы можем преобразовать true в 1 вот так:
При сложении и умножении, JavaScript, с помощью вызова того же конструктора Number(argument), приводит argument к числу, что даёт нам: если argument равен true, то возвращается 1. Если argument равен false, то возвращается 0.
✅ Поэтому мы можем складывать булевы значения как обычные числа и получать корректные результаты.
Очевидно, что будет вот так:
Number(true) // -> 1
Если он не может разобрать конкретное значение, то вычисляет его как NaN.
Поэтому мы можем преобразовать true в 1 вот так:
+true // -> 1
✅ Поэтому мы можем складывать булевы значения как обычные числа и получать корректные результаты.