Ok, I figured it out by myself. This odd data is so called promise returned by fetch(). In order to get rid of this I did so:
fetch(url)
.then(response => response.json().then(data => data))
.then(result => /* Do whatever you want with this result */)
.catch(error => /* Do something if error occurs */);
I don't know why I should do "promise decryption" twice, but it works. Any comments explaining this are appreciated.
UPDATE
Thanks to vdj4y's answer I now understand it correctly.
fetch() function is not returning a promise, as I wrote previously. It returns a Response object that contain information about request/response (like its statuses) and the data we need in ReadableStream format.
json() function, in turn, returns a promise that contain result of converting ReadableStream to plain js object. In order to manipulate data returned by promise, then() function is needed.
Corrected code here:
fetch(url)
.then(response => response.json())
.then(result => /* Do whatever you want with this result */)
.catch(error => /* Do something if error occurs */);