При вызове объекта в контексте где нужно строковое значение, происходит неявное преобразование типов. Неявно вызывается метод toString наследованный от Object.prototype, либо перезаписанный в классе на основе которого был создан объект.
const obj = {
name: "Alex",
gender: "male"
};
const arr = [1, 2, 3, 4, 5];
alert(obj); // [object Object]
alert(arr); // 1, 2, 3, 4, 5 // Перезаписанный метод toString();
// Тоже самое
alert(Object.prototype.toString.call(obj)) // [object Object] (obj.toString());
alert(Array.prototype.toString.call(arr)) // 1, 2, 3, 4, 5 (arr.toString());