Мы не знаем некоторых вещей о том, как оператор ! работает в Javascript.

Основы

! - это логический оператор, который преобразует значение в противоположное ему логическое. Поскольку JavaScript будет приводить значения, он преобразует значение в его правдивую / ложную форму и вернет противоположное логическое значение.

Когда мы выполняем операцию ! с числом, отличным от 0, она возвращает false. Это потому, что все числа, кроме 0, верны.

// evaluates to false
!1 
!-10
!1.2

Операция ! на 0, null, undefined, NaN возвращает true, поскольку они ложны.

//evaluates to true
!0
!NaN
!null
!undefined

Если мы выполним ! для undefined переменных, он вернет true.

var a ;
!a // true

Точно так же, если мы выполняем ! для переменной, которая имеет какое-то значение или указывает на некоторую ссылку, она возвращает false.

var a = [];
!a; // false

Странная часть

Когда мы делаем:

! + [] // then it is evaluated to true 

Причина в том, что оператор + работает только со строками и числами, поэтому, если мы выполняем двоичную операцию с массивом, то массив преобразуется в строку. Итак, подробный вид:

! + [] 
is converted internally into 
! + String([])
! + "" //it evaluates true because ! on empty string returns true

Итак, теперь давайте попробуем другую большую проблему (которую я нашел в Твиттере, решение также доступно там 😃)

(! + [] + [] + [] + ![]) 
! + [] --> true 
true + [] --> "true"
"true" +[] --> "true"
"true" + ![] -- >"truefalse"

Если вы хотите узнать больше об этих концепциях, вам следует изучить приведение типов в JavaScript и то, как истинные / ложные значения работают в JS.

Если вы найдете этот полезный сюрприз, то я здесь.

Поделитесь, если вы счастливы.

Следуйте Javascript Jeep🚙, если чувствуете себя достойным.