2012-04-23 40 views
9

Ít nhất trong Firefox, bạn có thể stringify một đối tượng Date:Tại sao JSON.stringify() chấp nhận đối tượng Ngày?

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

này hoạt động vì (trong Firefox) Date chứa một phương thức toJSON được sử dụng bởi serializer JSON của nó. Tuy nhiên, đây không phải là một phần của tiêu chuẩn JSON vì vậy tôi tự hỏi tại sao phương thức này tồn tại hoặc đúng hơn tại sao trình serializer JSON dựng sẵn kiểm tra phương thức như vậy. Vì nó không được chuẩn hóa, bạn không thể sử dụng nó một cách an toàn nếu không kiểm tra đầu tiên nếu serializer dựng sẵn hiểu nó và sử dụng tùy chỉnh (ví dụ như json2.js)

+5

Đây là một phần của tiêu chuẩn ECMAScript. – ChaosPandion

+0

cũng tồn tại trong Chrome: Date.prototype.toJSON –

+0

Tôi nghĩ rằng nó có thể đang gọi toString, nhưng tôi đã thử điều đó và bạn có định dạng chuỗi khác. – Andrea

Trả lời

6

Điều này hoạt động vì nó được xác định trong một vấn đề không rõ ràng trong đặc tả. Bắt đầu, bạn cần phải đào sâu vào phần 15.12.3 trong mô tả hoạt động trừu tượng Str được sử dụng để chuyển đổi giá trị thành biểu diễn chuỗi. Về cơ bản nếu đầu vào là một đối tượng, đặc điểm kỹ thuật nói để kiểm tra sự tồn tại của một giá trị có thể gọi là toJSON. Hãy nghĩ về điều này giống như một giao diện trong Java hoặc C#.

interface IAmJSON 
{ 
    string toJSON(string key); 
} 

Đây là văn bản chính xác từ đặc điểm kỹ thuật.

 
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. 

Cuối cùng, đối tượng ngày có toJSON định nghĩa trong phần 15.9.5.44.

Các vấn đề liên quan