Для массива и объекта срабатывает метод valueOf(), но для массива он не реализован и вызывается toString(), что вернет список элементов в виде строки, он пуст, а значит пустая строка "". Для объекта метод вернет [object Object]. Происходит конкатенация ""+[object Object].
В случае {}+{}. Первый объект является просто блоком, а не объектом, потому что скобки вне выражения. Поэтому остаётся +{}. Тут опять valueOf() вернет [object Object], но унарный плюс не сделает его числом и вернет NaN