2016-01-03 10 views
11

私は次のコードは、オブジェクトに番号をラップすることを理解する:理解JavaScriptオブジェクト(値)

var x = Object(5); 

Iしたがって期待すると理解次

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は、指定された値、値に対応するTypeのオブジェクトラッパーを作成します。

だから、Object

var x = Object(5); 

に番号を渡すとき、それは

var x = new Number(5); 

両方にvalueOf()を呼び出すとき、あなたは原始的に取得を行うこととまったく同じだプリミティブ値5でNumber objectを取得値5が再び返されます。これを文字列化すると、数値5が文字列化され、オブジェクトは文字列化される前にプリミティブな値に変換されます

JSON.stringifyの仕様は

ブール、数値、およびStringオブジェクトを言う伝統的な変換のセマンティクスと一致して、文字列化の際に対応するプリミティブ値に変換されます。オブジェクトとして

+0

したがって、それは異なるインスタンスであるため、falseが返されますか? \t \t \t var x =オブジェクト(5)。 \t \t \t var y = new Number(5); \t \t \t alert(x === y); – Sandy

+0

@Sandy - はい、直接厳密に比較すると、まだオブジェクトであり、2つのオブジェクトは決して同じではありません – adeneo

0
var x = Object(5); 

このボックス5ので、文字列化は、単に値をunboxes。

あなたがオブジェクトにキー/値を割り当てる場合は、文字列化のような表示されます。

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

これはjavascriptのダックタイピングである - それはアヒルのように見える、とアヒルのように聞こえる場合は、基本的、それはしかし、duckをintやcollectionなどのデータ型に置き換えてください。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"に変換しています。プリミティブ番号5のようなリテラル値にJSON.stringify()を呼び出すと、その文字列表現 "5"も返されます。あなたはオブジェクトとプリミティブの両方を文字列に変換しているので、それらは同じです。

関連する問題