Почему JSON.parse преобразует массив в объект?

Столкнулся с особенностью парсинга (либо по незнанию не понимаю от чего так происходит) массива с одной строкой.

Есть у нас массив с json строкой.

const arr = ['{"name": "John"}']; // массив
const parsedArr = JSON.parse(arr);
console.log(parsedArr); // объект

Почему массив преобразовался в объект?

Ещё примеров:

const example1 = ['"item"'];
console.log(JSON.parse(example1)); // 'item'

const example2 = ['["item"]'];
console.log(JSON.parse(example2)); // ['item']

Кажется, внутри метода parse идёт проверка на то, является ли переданный аргумент массивом. И если да, то если в массиве всего один элемент, то массив раскрывается и возвращается именно элемент массива.


Ответы (1 шт):

Автор решения: Stepan Kasyanenko

Тут ошибка в неявном преобразовании типов.

JSON.parse ожидает на вход строку. Соответственно входящий аргумент преобразуется в строку, ['{"name": "John"}'].toString() === {"name": "John"}.

В свою очередь это валидный JSON, который успешно парсится в объект.

То есть

const arr = ['{"name": "John"}']; // массив
const parsedArr = JSON.parse(arr);
console.log(parsedArr); // объект

То же самое что и

const arr = ['{"name": "John"}']; // массив
const arrString = ['{"name": "John"}'].toString();
console.log(arrString, typeof arrString); // строка
const parsedArr = JSON.parse(arrString);
console.log(parsedArr, typeof parsedArr); // объект

→ Ссылка