2011-05-16 71 views
6

我在想,也许我错过了JavaScript中的一些东西,我现在只是在接受。JSON.stringify()和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"} 

的区别是什么? 我以为新的对象()是一个微软的JScript的东西?我错过了什么? 必须在某个地方丢失规范中的某些东西。谢谢。

+0

你有什么期待? – hvgotcodes 2011-05-16 17:43:00

+2

*“我认为新的对象()是一个微软的JScript的东西?”*不,根本不是。这是标准的JavaScript(尽管它很冗长,只需使用'{}' - 在JScript和其他ECMAScript实现中都可以正常工作)。 – 2011-05-16 17:43:55

回答

20
a = new Object() 

a = [] 

是不等价的。但是,

a = {} 

a = new Object() 

是。

+0

好的。谢谢。感觉就像现在我得到我当天颁奖的愚蠢问题。 – BuddyJoe 2011-05-16 17:57:41

+0

我也错过了。 – 2011-05-16 18:11:49

1

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

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

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

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

默认对象是键 - >数据的所有地图,如果你没有

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

它应该用花括号{}

实例化。

+0

*“...可能会令人困惑,因为它不是一个关联数组“*实际上,它比这更混乱,因为它*是一个关联数组,而非数字键(属性名)在JavaScript中完全有效,因为[数组不是真正的数组](http://blog.niftysnippets.org/2011/01/myth-of-arrays.html)。但是,如果将数组转换为JSON,它们将被丢弃,因为JSON数组表示法不允许非数组 - 数字键(出于很好的理由,很少有语言会支持它们)。 – 2011-05-16 17:48:38

3

new Object()相当于{}(当它是不是因为怪异的重新定义问题,除了 - 但忽略现在)[]相当于new Array(),对此你再加入.name属性。 JSON以特殊的方式对数组进行字符串化,不会将任意的属性赋值给数组本身。

1

设置数组的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"}"