Подтвердить что ты не робот

Какая разница в использовании toString() по сравнению с JSON.stringify()?

В обоих случаях я получаю вывод содержимого объекта:

alert(JSON.stringify(obj));

или

alert(obj.toString());

так... какая разница? каковы преимущества или недостатки каждого из них?

Есть ли практические примеры, чтобы показать разницу?

4b9b3361

Ответ 1

Если у вас нет настраиваемого объекта с настраиваемым методом .toString, возвращающим JSON.stringify этого объекта, нет obj, который дал бы obj.toString() == JSON.stringify(obj).

Когда obj - это массив вроде [1,2,3], то .toString() дает:

"1,2,3"

И JSON.stringify:

"[1,2,3]"

Это близкие, но не совсем то же самое, сериализованный JSON не имеет никакой двусмысленности с запятыми и непосредственно работает как Javascript или может быть проанализирован как JSON.

См:

["1,",2,3].toString();
//"1,,2,3" ... so you can't just split by comma and get original array
//it is in fact impossible to restore the original array from this result

JSON.stringify(["1,",2,3])
//'["1,",2,3]'
//original array can be restored exactly

Ответ 2

для объекта say

obj = { a: 'a', '1': 1 }

obj.toString() дает

"[object Object]"

JSON.stringify(obj) дает

"{"1":1,"a":"a"}"

Для .toString() значение по умолчанию возвращается, когда тип аргумента является объектом. JSON.stringify, с другой стороны, возвращает текст JSON, который можно преобразовать обратно в объект JSON, используя JSON.parse

Ответ 3

Как вы могли заметить, когда вы пытались (надеюсь) вызвать .toString(), который любой наследует (*) из Object.prototype.toString(), возвращает [object Object].

Вот как он определяется внутри, возвращая внутреннее имя [Class] от объекта. Конечно, другие объекты могут переопределить этот метод (помните, что он только что определен в цепочке прототипов) и возвращают почти что угодно.

JSON.stringify(), с другой стороны, является методом объекта JSON, который сериализует структуру объекта в строковой версии. Следовательно, Javascript Object Notation, он будет описывать объект со всеми вложенными структурами в чистой строке ascii.


(*) исключение: объекты, созданные с помощью Object.create(null);

Ответ 4

Вы можете использовать параметр replacer и space в JSON.stringify, передав аргумент replacer как функцию, которую вы можете изменить, а параметр space и space поможет вам выделить дополнительное пространство перед каждой парой ключ-значение.

const replacer = (key, value) => {
        // Filtering out properties
        if (typeof value === 'number') {
            return 1;
        }
        return value;
    },

    foo = {
        country: 'India',
        state: 'Gujarat',
        district: 45,
        cm: 'car',
        am: 7
    },

    result = JSON.stringify(foo, replacer);

console.log(result) // {"country":"India","state":"Gujarat","district":1,"cm":"car","am":1}

Космический аргумент -

const obj = { a : 1, b:2};

const obj_str = JSON.stringify(obj, null, '     ');// '\t' gives one tab 

console.log(obj_str)

Для получения дополнительной информации вы можете перейти по этой ссылке.