2014-04-11 6 views
6

मैं वर्तमान प्रोजेक्ट में moment.js का उपयोग कर रहा हूं और मुझे लगता है कि तुलना ऑपरेटर <,>,> =, < = सही तरीके से काम करते हैं। हालांकि == नहीं करता है।MomentJS मूल्यों की तुलना कैसे करता है> और < (and > =, <=)?

यह मुझे आश्चर्य करता है कि ये काम और आपको .isBefore() और .isAfter() फ़ंक्शंस का उपयोग करने की आवश्यकता नहीं है।

क्या कोई मुझे इन कामों का संक्षिप्त वर्णन दे सकता है? क्या == काम करना भी संभव होगा?

धन्यवाद।

+0

क्या आप एक [jsfiddle] (http://jsfiddle.net) प्रदान कर सकते हैं? यह भी समस्या, मैं अनुमान लगा रहा हूं, डेटाटाइम मूल्य के कारण होता है। तिथि पर getTime() का उपयोग करके इसका परीक्षण करें और देखें कि वे बराबर हैं या नहीं। अन्यथा वे उस तिथि से जुड़े मूल्य के बजाय वास्तविक तिथि उदाहरण की तुलना कर सकते हैं। अंत में 'पल()। IsSame() 'का उपयोग करने का प्रयास करें। – Dom

+0

[जावास्क्रिप्ट में दिनांक चर के साथ समस्या का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/16873689/issue-with-date-variable-in-javascript) – Bergi

उत्तर

8

इस की वजह से है कैसे comparison and equality operators जावास्क्रिप्ट काम में (जोर मेरा):

रिलेशनल सार तुलना के लिए (जैसे, < =), ऑपरेंड पहले एक ही करने के लिए पुरातन में बदल जाती है, तो कर रहे हैं तुलना से पहले टाइप करें।

[...]

समानता ऑपरेटर ऑपरेंड धर्मान्तरित अगर वे एक ही प्रकार के नहीं हैं, तो सख्त तुलना लागू होता है। यदि ऑपरेंड नंबर या बूलियन है, तो संभव होने पर ऑपरेटरों को संख्या में परिवर्तित कर दिया जाता है; अन्यथा यदि कोई ऑपरेंड स्ट्रिंग है, तो स्ट्रिंग ऑपरेंड संभव होने पर किसी संख्या में परिवर्तित हो जाता है। यदि दोनों ऑपरेशंस ऑब्जेक्ट्स हैं, तो जावास्क्रिप्ट आंतरिक संदर्भों की तुलना करता है जो ऑपरेट करते समय बराबर होते हैं, उसी ऑब्जेक्ट को स्मृति में देखें।

तो जब दो पल वस्तुओं की असमानताओं की तुलना की जाती है, तो उन्हें पहले संख्याओं में परिवर्तित कर दिया जाता है।

> +moment() 
<- 1412332710977 

== समानता की जांच के लिए, क्रम: Moment.js वस्तुओं के लिए, यह आधी रात यूटीसी के यूनिक्स काल, 1 जनवरी 1970

अपने पसंदीदा ब्राउज़र की कंसोल विंडो/नोड आरईपीएल में के बाद से मिलीसेकेंड है दो ऑब्जेक्ट्स के बीच एक संदर्भ तुलना करता है, जो दो अलग-अलग पल उदाहरणों के लिए false देता है, भले ही वे दोनों एक ही दिनांक/समय के लिए हों।

जावास्क्रिप्ट में डिफ़ॉल्ट .equals() या operator==() ओवरलोडिंग की कमी इस व्यवहार को प्रतिद्वंद्वी बनाता है, खासकर अगर आप अन्य भाषाओं से आ रहे हैं।

इसके अलावा, ध्यान दें कि पल के isBefore/isAfter कार्यों वास्तव में धीमी गति से कर रहे हैं के रूप में वे दोनों पल तुलना करने से पहले आंतरिक वस्तुओं क्लोन (यह isBefore/isAfter के लिए एक वैकल्पिक तर्क जो समय घटक को निर्दिष्ट करने के लिए है, क्योंकि तुलना करें (उदाहरण के लिए 'hour') और यह इस बात पर ध्यान दिए बिना कि यह तर्क मौजूद है या नहीं)।

क्षण म्यूटेबल ऑब्जेक्ट्स होने से यहां पीड़ित है, यही कारण है कि यह पहले स्थान पर रक्षात्मक clone() कर रहा है, और उसके बाद सामान्य पथ को अनुकूलित नहीं किया जा रहा है, जहां यह वास्तव में अनावश्यक है।

4

जादू ValueOf() है। जावास्क्रिप्ट तुलना करते समय ऑब्जेक्ट को एक आदिम मान में बदलने के लिए valueOf() विधि को कॉल करता है। क्षण ऑब्जेक्ट overrides valueOf() मूल रूप से मूल मूल्य वस्तु ऑब्जेक्ट का मान मान वापस करने के लिए विधि, जो युग संख्या देता है।

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