2012-04-23 19 views
9

Al menos en Firefox, puede stringify un objeto Date:¿Por qué JSON.stringify() acepta objetos Date?

>>> JSON.stringify({'now': new Date()}) 
'{"now":"2012-04-23T18:44:05.600Z"}' 

Esto funciona porque (en Firefox) Date contiene un método toJSON que se utiliza por su serializador JSON. Sin embargo, esto no forma parte del estándar JSON, por lo que me pregunto por qué existe este método o, más bien, por qué el serializador JSON incorporado comprueba dicho método. Como no está estandarizado, no puede usarlo de manera segura sin probar primero si el serializador integrado lo entiende y utiliza uno personalizado (como json2.js)

+5

Forma parte del estándar ECMAScript. – ChaosPandion

+0

también existe en Chrome: Date.prototype.toJSON –

+0

Pensé que podría estar llamando a String, pero lo intenté y obtienes un formato de cadena diferente. – Andrea

Respuesta

6

Esto funciona porque está especificado en un asunto no tan claro dentro de la especificación. Comenzando, necesita profundizar en la sección 15.12.3 en la descripción de la operación abstracta Str que se utiliza para convertir valores en una representación de cadena. Básicamente, si la entrada es un objeto, la especificación dice que se compruebe la existencia de un valor invocable llamado toJSON. Piense en esto como una interfaz en Java o C#.

interface IAmJSON 
{ 
    string toJSON(string key); 
} 

Este es el texto exacto de la especificación.

 
2. If Type(value) is Object, then 
    a. Let toJSON be the result of calling the [[Get]] internal method of value with argument "toJSON". 
    b. If IsCallable(toJSON) is true 
     i. Let value be the result of calling the [[Call]] internal method of toJSON passing value as the this value and with an argument list consisting of key. 

Por último, el objeto de fecha tiene toJSON definido en la Sección 15.9.5.44.

Cuestiones relacionadas