В обоих случаях я получаю вывод содержимого объекта:
alert(JSON.stringify(obj));
или
alert(obj.toString());
так... какая разница? каковы преимущества или недостатки каждого из них?
Есть ли практические примеры, чтобы показать разницу?
В обоих случаях я получаю вывод содержимого объекта:
alert(JSON.stringify(obj));
или
alert(obj.toString());
так... какая разница? каковы преимущества или недостатки каждого из них?
Есть ли практические примеры, чтобы показать разницу?
Если у вас нет настраиваемого объекта с настраиваемым методом .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
для объекта say
obj = { a: 'a', '1': 1 }
obj.toString()
дает
"[object Object]"
JSON.stringify(obj)
дает
"{"1":1,"a":"a"}"
Для .toString() значение по умолчанию возвращается, когда тип аргумента является объектом. JSON.stringify, с другой стороны, возвращает текст JSON, который можно преобразовать обратно в объект JSON, используя JSON.parse
Как вы могли заметить, когда вы пытались (надеюсь) вызвать .toString()
, который любой наследует (*) из Object.prototype.toString()
, возвращает [object Object]
.
Вот как он определяется внутри, возвращая внутреннее имя [Class]
от объекта. Конечно, другие объекты могут переопределить этот метод (помните, что он только что определен в цепочке прототипов) и возвращают почти что угодно.
JSON.stringify()
, с другой стороны, является методом объекта JSON, который сериализует структуру объекта в строковой версии. Следовательно, Javascript Object Notation, он будет описывать объект со всеми вложенными структурами в чистой строке ascii.
(*) исключение: объекты, созданные с помощью Object.create(null);
Вы можете использовать параметр 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)
Для получения дополнительной информации вы можете перейти по этой ссылке.