Как минимум [] == [] будет фалс, потому-что объекты разные.
Далее мы инвертируем правый массив как булевое значение через ! и получаем false т.к. массив то есть и он сам по себе true
Пока что получаем true == false
Но что дальше, при таком сравнении пустой массив слева представляет собой сравнение разных типов, поэтому приводим сперва массив слева юзая toString (или valueOf) не помню точно, и получаем пустую строку, которая в свою очередь falsy значение, вот и выходит
false == false = true