сначала у массива вызывается метод valueOf, но он возвращает не примитив, а сам массив, и приходится вызвать toString, который дает строку, потому складывается строка с числом.
вот, поэкспериментируй в консоли браузера
var v12 = {
valueOf: () => {console.log('valueOf'); return [1];},
toString: () => {console.log('toString'); return '2';}
}
console.log(v12 + 2);
если убрать квадратные скобки, то toString не понадобится