Немного магии в JS

в 12:17, , рубрики: Песочница, метки: , , , , ,

Хочу рассказать об одном очень забавном баге, с которым столкнулся. Возможно, более опытные разработчики сейчас скажут «этот баг давно известен» и на меня посыпятся гневные отзывы, но все же, я не нашел упоминаний о нем, когда искал варианты решений. А решил я его абсолютно «безполезной» строкой кода. Кому интересно — добро пожаловать под кат.

В чем, собственно, суть. Разрабатывался проект. Разрабатывался у нас на тестовом сервере и все работало отлично было пару связок передачи данных по AJAX от PHP на фронтенд в виде JSON, который генерировался на стороне сервера через json_encode(). И все было отлично, данные получались, обрабатывались и выводились. До тех пор, пока мы не переехали на релизный сервер. И тут я получаю замечательную ошибку: JSON parse error unexpected sysmbol at line 1, column 1. Первым делом я определяю в каком из AJAX зпросов этот баг вылез. Пациент найден. Добавляем перед

var dataObj = JSON.parse(data);

отладочный вывод:

console.log(data);

И видим, что это вполне валидный JSON:

{"dates":["2014-12-02","2014-12-03","2014-12-04","2014-12-05","2014-12-10","2014-12-11","2014-12-15","2014-12-20","2014-12-21"]}

Скопировав всю строку из вывода в JSON validator и убрав кавычки, вдруг, обнаруживаем один непечатаемый символ. Сразу думаю про кодировку и тд, но все это работает на modX и, если бы кодировка хромала — то, багало-бы все, а не один метод.
Итого, почти уже в агонии я пишу такой код:

var dat = data.substing(0,data.length);
var d = JSON.parse(dat);

Каково-же было мое удивление, когда все заработало отлично. Итого, substring, который не обрезает строку, спасает наш JSON.

В итоге: все работает и заказчик доволен.

К сведению — обработчик ajax для этого кода обрабатывает и другие запросы, и отправляет другие респонсы и только в этом месте он падал. Откуда такое поведение и что конкретно делает substring в данном контексте — я не знаю. Надеюсь, в комментариях будет объяснение этого парадокса.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js