( persicsb | 2016. 05. 18., sze – 21:45 )

Gondolom innen jutottál ide:
https://www.destroyallsoftware.com/talks/wat

Old, but gold.

Mindenesetre:
http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1

Azaz a lényeg: először kiértékeljük a bal oldalt mint összeadást, majd a jobb oldalt mint szorzást (szorzás jellegű kifejezést), és primitív értéket csinálunk belőlük.

Ha a jobb oldal vagy a bal oldal primitívje string, akkor konkatenálást végzünk.
Ha egyik sem string, akkor pedig számmá alakítjuk őket, majd összeadjuk.
A primitív értékké kiszámolást ez végzi:
http://www.ecma-international.org/ecma-262/5.1/#sec-9.1

Ezek szerint objektumoknál (az Array is objektum) a defaultValue-t adja vissza a primitív érték.
Ezeknek a szabályai:
http://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8

Azaz mivel az összeadásnál hint nélkül hívjuk a toPrimitive-t, ezért a hint Number.
Azaz a valueOf és a toString metódusokat keresi az objektumban. Ha a valueOf visszatérési értéke primitív, akkor visszatér azzal.
Egyébként a toString értékével, ha az primitív.
Ha egyik sem primitív, akkor kivétel történik.

Nos, az Array típusra létezik a toString és a valueOf.
http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.2
Az Array valueOf-ja az Object valueOf-ja.
Nos, az Object.valueOf értéke nem String típusú (hanem a bemenő adatot adja vissza ez esetben, azaz Array), ezért a toString lesz az érvényes.

Ez a toString tulajdonképpen egy join-t hív az elemekre.
A join definíciója:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.5

Azaz üres tömb primitívje a "".

Az üres objektum primitívje még a kérdéses.
Itt is a toString lesz az érdekes. Ami az üres Objektumnál "[object Object]":
http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.2

Azaz:
1. Két üres sztring összefűzése az eredmény, ami üres sztring.
2. [object Object] és üres sztring összefűzése
3. ????? Ezt nem tudtam kihámozni a specifikációból semmiféleképpen sem. Mivel az üres tömb primitív értéke mindenképpen String típusú (az üres karakterlánc), ezért nem lehetne itt számmá alakítást csinálni, szerintem ez egy runtime bug.
4. [object Object] és [object Object] összefűzése.