JSON文本和JavaScript对象。我感到困惑。

8

让我们来考虑这段代码:

(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. 如果是,为什么?如果不是,为什么?

请在你的答案中添加参考文献。

演示


a、b和c是具有相同键值对的不同对象。a == b将返回false,因为它们在内存中的位置不同。 - Anoop
2个回答

7

ab会产生“相同”的对象(就像{a:1}{a:1}是相同的一样)。

JSON.parse解析输入的JSON字符串,并输出解析后的值。在这种情况下,是一个对象。

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

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

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

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

enter image description here

c 在右边。它创建了一个没有自身属性的对象。您指定的属性实际上在 c 的原型上。原因是Object.create 的第一个参数是要创建的对象的原型。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接