2012-04-23 13 views
9

कम से कम Firefox में, आप एक तिथि वस्तु stringify कर सकते हैं:JSON.stringify() दिनांक ऑब्जेक्ट्स क्यों स्वीकार करता है?

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

यह काम करता है क्योंकि (फ़ायरफ़ॉक्स में) Date एक toJSON विधि है जो अपने JSON serializer द्वारा प्रयोग किया जाता है शामिल हैं। हालांकि, यह JSON मानक का हिस्सा नहीं है इसलिए मुझे आश्चर्य है कि यह विधि क्यों मौजूद है या क्यों अंतर्निहित JSON serializer ऐसी विधि के लिए जांच करता है। चूंकि यह मानकीकृत नहीं है कि आप बिना किसी परीक्षण के सुरक्षित रूप से इसे सुरक्षित रूप से उपयोग नहीं कर सकते हैं यदि बिल्टिन सीरियलाइज़र इसे समझता है और अन्यथा कस्टम एक का उपयोग करता है (जैसे json2.js)

+5

यह ईसीएमएस्क्रिप्ट मानक का हिस्सा है। – ChaosPandion

+0

यह क्रोम में भी मौजूद है: Date.prototype.toJSON –

+0

मैंने सोचा कि यह स्ट्रिंग को कॉल कर रहा है, लेकिन मैंने कोशिश की और आपको स्ट्रिंग का एक अलग प्रारूप मिलता है। – Andrea

उत्तर

6

यह काम करता है क्योंकि यह विनिर्देश के भीतर एक स्पष्ट स्पष्ट मामले में निर्दिष्ट नहीं है। शुरू करने से आपको धारा 15.12.3 में अमूर्त ऑपरेशन स्ट्र के विवरण में खोदने की आवश्यकता है जिसका उपयोग मूल्यों को स्ट्रिंग प्रस्तुति में परिवर्तित करने के लिए किया जाता है। अनिवार्य रूप से यदि इनपुट एक वस्तु है तो विनिर्देश toJSON नामक कॉल करने योग्य मान के अस्तित्व की जांच करने के लिए कहता है। इस बारे में जावा या सी # में एक इंटरफ़ेस की तरह सोचें।

interface IAmJSON 
{ 
    string toJSON(string key); 
} 

यह विनिर्देश से सटीक पाठ है।

 
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. 

अंत में, तारीख वस्तु toJSON अनुभाग 15.9.5.44 में परिभाषित किया गया है।

संबंधित मुद्दे