2011-05-16 118 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"}"