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

请添加对您的答案的引用。

演示

4

2 回答 2

7

ab产生“相同”的对象(与{a:1}abd相同的方式{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! )
于 2012-10-11T14:18:19.407 回答
7

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

在此处输入图像描述

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

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

var d = Object.create(Object.prototype, { 
    "id": { "value": 1 }, //values are 'property descriptors'
    "name": { "value": "mike" }
    //etc...
});
于 2012-10-11T14:18:35.997 回答