2012-10-11 13 views
8

混乱していますのは、このコードを考えてみましょう:3つの割り当てとの違いですJSONリテラルとJavascriptオブジェクト。私は

(function(){ 
    var a = {"id": "1", "name": "mike", "lastname": "ross"}; 
    var b = JSON.parse('{"id": "1", "name": "mike", "lastname": "ross"}'); 
    var c = Object.create({"id": "1", "name": "mike", "lastname": "ross"}); 

    document.write(typeof(a) + "</br>"); 
    document.write(typeof(b) + "</br>"); 
    document.write(typeof(c) + "</br>"); 
})();​ 

質問

  1. オブジェクトa、b、cは正確に重なっていますか?
  2. 「はい」の場合、なぜですか?いいえ、なぜですか?

回答を参考にしてください。

Demo

+0

、a、b及びcは同じキーと値のペアを持つ別のオブジェクトです。 a == bはfalseになります。彼らは記憶の異なる場所にいる。 – Anoop

答えて

7

abは(彼らは同じ場所で、同じ値で、同じ性質を持っている)を効果的に同じです。これは、可能な機能を提供しています。 cは完全に異なっています。あなたがコンソールにオブジェクトをログ代わりのページに限定された情報を印刷する場合は、明確な違いを見ることができます:

enter image description here

c右の一つです。独自のプロパティを持たないオブジェクトが作成されます。指定したプロパティは、prototypecにあります。これは、Object.createの最初の引数が、作成するオブジェクトのprototypeであるためです。あなた同じ効果を得るためにObject.createを使用することができ

注 - ちょうど最初の引数としてObject.prototypeを渡す:

var d = Object.create(Object.prototype, { 
    "id": { "value": 1 }, //values are 'property descriptors' 
    "name": { "value": "mike" } 
    //etc... 
}); 
7

a及び({a:1}{a:1} ABDが同一であるのと同じように) "indentical" オブジェクトでb結果。

JSON.parseは、入力JSON の文字列を解析し、解析された値を出力します。この場合、オブジェクトです。

cが異なります。 Object.createは、プロトタイプが最初の引数に設定された新しいオブジェクトを作成します。 c.__proto__.id1と等しいことを確認できます(最初の2つのケースでは使用できません)。

3つの方法のすべてが「同じ」オブジェクトになります。プロパティーidを読むと、いずれの場合も1となります。 3番目のケースでは、この結果はプロトタイプの継承によって発生します。

var x = Object.create({id:1}); 
x.id = NaN; 
console.log(x.id); 
// NaN 
delete x.id; 
console.log(x.id); 
// 1 - The old value is back :) 
// (for x = {id: 1};, the old value would be gone!) 
関連する問題