2012-10-11 38 views
8

Vamos a considerar este código:literales JSON y objetos Javascript. Estoy confundido

(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>"); 
})();​ 

Preguntas

  1. ¿Cuáles son las diferencias entre las tres asignaciones?
  2. ¿Se superponen exactamente los objetos a, byc?
  3. En caso afirmativo, ¿por qué? Si no, ¿por qué?

Por favor, añada algunas referencias a sus respuestas.

Demo.

+0

a, b y c son objeto diferente con un mismo par valor de la clave. a == b será falso. están en diferentes lugares en la memoria. – Anoop

Respuesta

7

a y b son efectivamente idéntica (tienen las mismas propiedades, con los mismos valores, en los mismos lugares). c es completamente diferente. Se puede ver una clara diferencia si se registra los objetos a la consola en lugar de imprimir información limitada a la página:

enter image description here

c es el de la derecha. Se creó un objeto sin propiedades propias. Las propiedades que ha especificado están actualmente en el prototype de c. La razón para esto es que el primer argumento para Object.create es prototype del objeto que se creará.

Tenga en cuenta que podría uso Object.create para obtener el mismo efecto - sólo tiene que pasar Object.prototype como primer argumento:

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

a y b resultado en objetos "indentical" (en la misma forma que {a:1} abd {a:1} son idénticas).

JSON.parse analiza la entrada JSON cadena, y emite el valor analizado. En este caso, un objeto.

c es diferente. Object.create crea un nuevo objeto con el prototipo establecido en el primer argumento. Puede verificar que c.__proto__.id sea igual a 1 (y no esté disponible en los primeros dos casos).

A primera vista, todos los tres métodos dan como resultado el "mismo" objeto: Leer la propiedad id da 1 en todos los casos. En el tercer caso, este resultado es causado por la herencia del prototipo. Esto ofrece una posible característica :

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!) 
Cuestiones relacionadas