Неявное преобразование объектов почему работает по-разному?
=============================================================

 В неявном преобразовании объектов приводятся к примитиву обе стороны, а потом происходит вычисление операции.   

Если `{} + {} // NaN` , то есть обе стороны преобразуются к числу.  

А в этом случае `[] + {} // "[object Object]"` , то есть правая часть преобразуется в строку, хотя по логике должно к числу, и выводить строку "NaN".  

Почему так происходит? 

 Для массива и объекта срабатывает метод valueOf(), но для массива он не реализован и вызывается toString(), что вернет список элементов в виде строки, он пуст, а значит пустая строка "". Для объекта метод вернет [object Object]. Происходит конкатенация ""+[object Object].   

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