JSON.stringify() 和 JavaScript 对象

Posted

技术标签:

【中文标题】JSON.stringify() 和 JavaScript 对象【英文标题】:JSON.stringify() and JavaScript Objects 【发布时间】:2011-08-26 15:26:00 【问题描述】:

我在想也许我错过了一些我现在正在学习的 javascript 内容。

我在 Chrome 控制台中尝试了这段代码:

a = [];
a.name = "test";
JSON.stringify(a); 
// which returns value []
a = new Object();
a.name = "test";
JSON.stringify(a); 
// which returns value "name":"test"

有什么区别? 我认为 new Object() 是 Microsoft JScript 的东西?我错过了什么? 一定在某个地方的规范中遗漏了一些东西。谢谢。

【问题讨论】:

“我认为 new Object() 是 Microsoft JScript 的东西?” 不,一点也不。那是标准的 JavaScript(虽然它很冗长,但只需使用 代替——它在 JScript 和其他 ECMAScript 实现中都可以正常工作)。 【参考方案1】:
a = new Object()

a = []

不等价。但是,

a = 

a = new Object()

是。

【讨论】:

好的。谢谢。感觉我现在得到了每日奖励的愚蠢问题。【参考方案2】:

new Object() 等价于 (除非不是因为奇怪的重新定义问题 - 但暂时忽略它。)[] 等价于 new Array(),然后您将添加一个 @987654325 @ 财产。 JSON 以一种特殊的方式对数组进行字符串化,不会捕获对数组本身的任意属性分配。

【讨论】:

【参考方案3】:

对于 JSON 数据,数组具有数字索引,对象具有键/值对。

a = [];
a[ 0 ] = "test";

JSON.stringify(a); // returns value ["test"]

【讨论】:

【参考方案4】:

是的,您正在使用 [] 定义您的对象,该对象实际上是一个数组,但根据您所来自的语言可能会令人困惑,因为它不是关联数组。

默认对象都是key->data的映射,用大括号实例化

如果你这样做了

a = ;
a.name = "test";
JSON.stringify(a); 

它应该可以工作。

【讨论】:

"... 可能会令人困惑,因为它不是关联数组" 实际上,它比这更令人困惑,因为它 关联数组数组和非数字键(属性名)在 JavaScript 中完全有效,因为 arrays aren't really arrays。但是如果将数组转换为 JSON,它们会被丢弃,因为 JSON 数组表示法不允许非数字键(有充分的理由,很少有语言会支持它们)。【参考方案5】:

设置数组的name 属性对其序列化(JSON 字符串化)形式没有任何作用。它不会将条目放入数组中。为此,您需要a.push('test')

对象是 Javascript 的标准部分(例如,参见MDC docs)。创建对象的常规方法是使用,但new Object() 也可以。

所以...

var a = [];
a.push('test');
JSON.stringify(a); //"["test"]"

a = ;
a.name = 'test';
JSON.stringify(a); //""name":"test""

【讨论】:

以上是关于JSON.stringify() 和 JavaScript 对象的主要内容,如果未能解决你的问题,请参考以下文章

JSON.stringify()和JSON.parse()

JSON.stringify()和JSON.parse()

JSON.parse()和JSON.stringify()

2018-04-09(JSON.parse和JSON.stringify的编码解码)

qs.stringify和JSON.stringify()

关于JSON.stringify的妙用