JSON 文本和 Javascript 对象。我很困惑

JSON literals and Javascript objects. I am confused

提问人:Alberto De Caro 提问时间:10/11/2012 最后编辑:Alberto De Caro 更新时间:10/11/2012 访问量:374

问:

让我们考虑一下这段代码:

(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. 这三项作业之间有什么区别?
  2. 对象 a、b 和 c 是否完全重叠?
  3. 如果是,为什么?如果不是,为什么?

请在您的答案中添加参考资料。

演示

JavaScript JS的

评论

0赞 Anoop 10/11/2012
a、b 和 c 是具有相同键值对的不同对象。a== b 将为 false。它们位于内存中的不同位置。

答:

7赞 Rob W 10/11/2012 #1

a并导致“相同的”对象(就像 abd 相同一样)。b{a:1}{a:1}

JSON.parse分析输入 JSON 字符串,并输出分析后的值。在本例中为对象。

c是不同的。Object.create 创建一个新对象,并将原型设置为第一个参数。您可以验证它是否等于(在前两种情况下不可用)。c.__proto__.id1

乍一看,所有三种方法都会产生“相同”的对象:在所有情况下读取属性都会给出。在第三种情况下,此结果是由原型继承引起的。这提供了一个可能的功能id1

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! )
7赞 James Allardice 10/11/2012 #2

a并且实际上是相同的(它们在相同的位置具有相同的属性,具有相同的值)。 是完全不同的。如果将对象记录到控制台,而不是将有限的信息打印到页面,则可以看到明显的差异:bc

enter image description here

c是右边的那个。它创建了一个没有自己属性的对象。您指定的属性实际上位于 上。这样做的原因是 Object.create 的第一个参数是要创建的对象。prototypecprototype

请注意,您可以使用来获得相同的效果 - 只需作为第一个参数传递:Object.createObject.prototype

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