Пояснение
Обратите внимание: собственный метод toString объекта a в задаче возвращает число, а не строку. Не имеет значения, что в названии "toString" есть слово string, тип возвращаемой этим методом переменной зависит только от самой переменной.
В случае переменных c и d автоматически вызываемый на массиве метод Array.prototype.toString() всегда возвращает строку.
В итоге получилось: 4 + 0 - '3' + '4';
Оператор плюс всегда выполняет конкатенацию, а не сложение, если хотя бы один из операндов является строкой.