58

在这两种情况下,我都会输出对象的内容:

alert(JSON.stringify(obj));

或者

alert(obj.toString());

所以......有什么区别?每一种的优点或缺点是什么?

有没有实际的例子来显示差异?

4

4 回答 4

51

除非您有一个自定义对象并.toString返回JSON.stringify该对象的自定义方法,否则obj不会给出obj.toString() == JSON.stringify(obj).

像thenobj这样的数组何时给出:[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
于 2013-04-05T12:49:10.877 回答
31

对于一个对象说

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

obj.toString()

"[object Object]"

JSON.stringify(obj)

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

对于.toString(),当参数类型是对象时返回默认值。另一方面, JSON.stringify返回 JSON 文本,可以使用JSON.parse将其转换回 JSON 对象

于 2013-04-05T12:38:35.830 回答
9

正如您可能已经注意到的那样,当您尝试(希望如此)时,调用.toString()任何对象继承(*​​)的对象Object.prototype.toString(),返回[object Object].

这就是它内部定义的方式,从对象返回内部[Class]名称。当然,其他对象可以覆盖这个方法(记住,它最初是在原型链上定义的)并返回几乎任何东西。

JSON.stringify()另一方面,是 JSON 对象的一种方法,它将对象结构序列化为字符串版本。因此,Javascript Object Notation将描述一个具有纯ascii 字符串中所有嵌套结构的对象。


(*) 例外:使用创建的对象Object.create(null);

于 2013-04-05T12:39:03.987 回答
1

您可以在 JSON.stringify 中使用 replacer 和 space 参数,将 replacer 参数作为函数传递,您可以修改 object 和 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)

有关更多详细信息,您可以访问此链接。

于 2019-09-01T17:39:21.700 回答