Ну начну с того что возвращать просто число - никто так не делает.
Обычно возвращают JSON что в разы удобнее.
Во вторых переписывать стандартную функцию trim - я бы не делал этого вообще. Это ужасный говнокод, и если ты юзаешь где-то ещё trim'ы, а обычно народ юзает, то у тебя на trim'ы будет уходить в раз 10 больше ресурсов чем на стандартный.
Плюс писать так:
var resp = new String().trim(req.responseText);
Это гиперговнокондство, т.к. ты уже имеешь прототип функцию для String'а.
Так что пиши так:
var resp = req.responseText.trim();
Далее, да, ты никогда не должен полагаться на идентичность обработки ответов в броузерах на столь детальном уровне. Пустые пробелы или наличие /n или /r в конце сообщения. Также есть проблемы когда возвращается application/json, и в броузере стоит специальный аддон который json запросы красиво отображает - это дело вообще поломает твой запрос.
Если шлёшь от сервера данные, и хочешь чтобы они были максимально идентичны, шли с нужным Content-Type который не будет модифицироваться броузерами, например:
Такой запрос не должен быть обработан от сервера.
А вообще, я тебе порекомендую делать как все - шли JSON от сервера, так даже будет проще и удобнее слать сложные ответы.
header('Content-type: application/json');
$data = array();
$data['number'] = 4;
echo json_encode($data);
И на клиенте так:
var data = JSON.parse(req.responseText);
switch(data.number) {
...
Так ты сможешь слать любой приемлемой сложности данные, и без проблем парсить их в JSON.