2016-01-03 26 views
11

我明白,下面的代碼包裝了一個號碼到一個對象:理解JavaScript對象(值)

var x = Object(5); 

因此,我希望和了解以下內容:

alert(x == 5); //true 
alert(x === 5); //false 

然而,我也明白對象是鍵/值對的列表。所以我期望以下幾點不同:

alert(JSON.stringify(5)); //5 
alert(JSON.stringify(x)); //5 

x的結構是什麼樣的?爲什麼它看起來不是鍵/值對格式?

+0

這裏的問題是'JSON.stringify()'的行爲,是嗎? – Pointy

+0

我不確定。我想我把所有對象都定義爲鍵/值對的定義過於字面,因此我們期望按鍵/值對格式來定義。 – Sandy

+0

那是那種 - 我的意思;在你的問題中來自'JSON.stringify()'的輸出是特定API如何工作的結果。它明確理解Number實例在結果JSON中應該被視爲數值。 – Pointy

回答

11

Object constructor爲給定值創建一個對應於該值的類型的對象封裝器。

所以,你得到一個Number object與原始值5傳遞一個數字時Object

var x = Object(5); 

這是完全一樣的,呼籲雙方valueOf()時做

var x = new Number(5); 

,你得到的原始值5再次回來,這就是爲什麼字符串化它給與字符串數字5相同的原因,對象在字符串化之前被轉換爲它的原始值

JSON.stringify用於規範表示字串中

布爾,數字和字符串對象被轉換爲相應的的原始值,在符合傳統轉換語義。

+0

所以下面的返回false是因爲它是一個不同的實例嗎? \t \t \t var x = Object(5); \t \t \t var y = new Number(5); \t \t \t alert(x === y); – Sandy

+0

@Sandy - 是的,當直接和嚴格比較時,它仍然是對象,而且兩個對象從不相同 – adeneo

0
var x = Object(5); 

此盒5爲對象,所以字符串化只是unboxes的值。

如果您分配一個鍵/值對的對象,字符串化將顯示爲這樣:

var x = {}; 
x.foo = "bar"; 

這是JavaScript的鴨子類型 - 基本上如果它看起來像鴨子,和聽起來像鴨子,那麼它必須是鴨然而,取代鴨與數據類型,如int或集合... https://en.m.wikipedia.org/wiki/Duck_typing

0

在一個JavaScript控制檯,我輸入以下內容:

> var x = Object(5); 
> x 
[Number: 5] 
> JSON.stringify(5) 
'5' 
> JSON.stringify(x) 
'5' 

當您使用Object(5)時,您正在創建一個包含鍵/值對的對象。但是,JSON.stringify()正在將該對象轉換爲其字符串表示形式 - 「5」。調用JSON.stringify()就像原始數字5那樣的字面值也返回它的字符串表示 - 「5」。你將對象和原語轉換爲字符串,這就是爲什麼它們是平等的。