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 对象的主要内容,如果未能解决你的问题,请参考以下文章