एक पेशेवर गणितज्ञ के रूप में, मैं जावास्क्रिप्ट के सममित ऑपरेटर ==
( जिसे "अमूर्त तुलना", "ढीली समानता" भी कहा जाता है ) को संस्थाओं के बीच एक समानता संबंध बनाने का प्रयास करता हूं , जिसमें रिफ्लेक्सिव , सममित और सकर्मक शामिल हैं । दुर्भाग्य से, इन तीन मौलिक गुणों में से दो असफल:
A == A
असत्य हो सकता है, उदा
NaN == NaN // false
A == B
और B == C
एक साथ मतलब नहीं है A == C
, जैसे
'1' == 1 // true
1 == '01' // true
'1' == '01' // false
केवल सममित संपत्ति बच जाती है:
A == B
तात्पर्य B == A
, जो उल्लंघन किसी भी मामले में संभवतया अकल्पनीय है और इससे गंभीर विद्रोह होगा;)
तुल्यता संबंध क्यों मायने रखता है?
क्योंकि यह सबसे महत्वपूर्ण और प्रचलित प्रकार का संबंध है, जो कई उदाहरणों और अनुप्रयोगों द्वारा समर्थित है। सबसे महत्वपूर्ण अनुप्रयोग समता वर्गों में संस्थाओं का अपघटन है , जो अपने आप में संबंधों को समझने का एक बहुत ही सुविधाजनक और सहज तरीका है। और समतुल्यता होने की विफलता, समतुल्यता वर्गों की कमी की ओर ले जाती है, जो बदले में गहनता और अनावश्यक जटिलता की कमी की ओर जाता है जो कि अच्छी तरह से जाना जाता है।
==
गैर-तुल्यता संबंध के लिए लिखना इतना भयानक विचार क्यों है ?
क्योंकि यह हमारी परिचितता और अंतर्ज्ञान को तोड़ता है, क्योंकि वस्तुतः समानता, समानता, अनुरूपता, समरूपता, पहचान आदि का कोई भी दिलचस्प संबंध एक समानता है।
रूपांतरण टाइप करें
सहज ज्ञान युक्त तुल्यता पर निर्भर होने के बजाय, जावास्क्रिप्ट प्रकार रूपांतरण शुरू करता है:
समानता ऑपरेटर ऑपरेंड्स को परिवर्तित करता है यदि वे एक ही प्रकार के नहीं हैं, तो सख्त तुलना लागू करता है।
लेकिन प्रकार रूपांतरण कैसे परिभाषित किया गया है? कई अपवादों के साथ जटिल नियमों का एक सेट है?
तुल्यता संबंध बनाने का प्रयास
बूलियन्स। स्पष्ट रूप से true
और false
समान नहीं हैं और विभिन्न वर्गों में होना चाहिए।
नंबर। सौभाग्य से, संख्याओं की समानता पहले से ही अच्छी तरह से परिभाषित है, जिसमें दो अलग-अलग संख्याएं समान समानता वर्ग में कभी नहीं होती हैं। गणित में, वह है। जावास्क्रिप्ट में संख्या की धारणा कुछ अधिक विदेशी की उपस्थिति के माध्यम से विकृत है-0
, Infinity
और -Infinity
। हमारे गणितीय अंतर्ज्ञान तय है कि 0
और -0
एक ही कक्षा में होना चाहिए (वास्तव में -0 === 0
है true
), जबकि infinities से प्रत्येक एक अलग वर्ग है।
नंबर और बुलियन। संख्या वर्गों को देखते हुए, हम बूलियन कहां डालते हैं? false
के समान हो जाता है 0
, जबकि दूसरी संख्या के true
समान हो जाता है 1
:
true == 1 // true
true == 2 // false
क्या यहाँ कोई तर्क है true
साथ में रखने के लिए 1
? विशेष रूप 1
से प्रतिष्ठित है, लेकिन ऐसा है -1
। मैं व्यक्तिगत रूप से परिवर्तित true
करने का कोई कारण नहीं देखता हूं 1
।
और यह और भी बदतर हो जाता है:
true + 2 // 3
true - 1 // 0
तो true
वास्तव में 1
सभी नंबरों में परिवर्तित हो गया है ! क्या यह तर्कसंगत है? क्या यह सहज है? जवाब व्यायाम के रूप में छोड़ दिया गया है;)
लेकिन इससे क्या:
1 && true // true
2 && true // true
होने के x
साथ एकमात्र बूलियन है । कौन सा साबित करता है कि दोनों और (और की तुलना में किसी अन्य नंबर ) में बदलने का ! यह दर्शाता है कि हमारा रूपांतरण एक अन्य महत्वपूर्ण संपत्ति - बायजेक्शन होने में विफल रहता है । मतलब कि दो अलग-अलग इकाइयाँ एक ही में बदल सकती हैं। जो, अपने आप से, एक बड़ी समस्या नहीं है। बड़ी समस्या तब पैदा होती है जब हम इस रूपांतरण का उपयोग "साम्यता" या "ढीली समानता" के संबंध का वर्णन करने के लिए करते हैं जो हम इसे कॉल करना चाहते हैं। लेकिन एक बात स्पष्ट है - यह एक समतुल्य संबंध नहीं होने जा रहा है और यह सहज रूप से समतुल्यता वर्गों के माध्यम से वर्णित नहीं होने जा रहा है।x && true
true
x = true
1
2
0
true
लेकिन क्या हम बेहतर कर सकते हैं?
कम से कम गणितीय रूप से - निश्चित रूप से हाँ! बूलियन और संख्याओं के बीच एक सरल तुल्यता का संबंध केवल false
और 0
उसी वर्ग में होने के साथ निर्मित किया जा सकता है । तो false == 0
केवल गैर-तुच्छ ढीली समानता होगी।
तार के बारे में क्या?
हम शुरुआत में और अंत में व्हाट्सएप से स्ट्रिंग्स को संख्याओं में बदलने के लिए ट्रिम कर सकते हैं, साथ ही हम सामने के शून्य को भी अनदेखा कर सकते हैं:
' 000 ' == 0 // true
' 0010 ' == 10 // true
तो हम एक स्ट्रिंग के लिए एक सरल नियम प्राप्त करते हैं - सामने व्हाट्सएप और जीरो ट्रिम करें। या तो हमें एक संख्या या रिक्त स्ट्रिंग मिलती है, जिस स्थिति में हम उस संख्या या शून्य में परिवर्तित होते हैं। या हमें एक नंबर नहीं मिलता है, जिस स्थिति में हम परिवर्तित नहीं होते हैं और इसलिए कोई नया संबंध नहीं मिलता है।
इस तरह हम वास्तव में बूलियन, संख्या और तारों के कुल सेट पर एक परिपूर्ण तुल्यता संबंध प्राप्त कर सकते हैं! सिवाय इसके कि ... जावास्क्रिप्ट डिजाइनरों स्पष्ट रूप से एक और राय है:
' ' == '' // false
तो दो तार जो दोनों को परिवर्तित करते 0
हैं वे अचानक गैर-समान हैं! क्यों या क्यों? नियम के अनुसार, स्ट्रिंग्स शिथिल समान रूप से ठीक होते हैं जब वे कड़ाई से बराबर होते हैं! जैसा कि हम देखते हैं, न केवल यह नियम परिवर्तनशीलता को तोड़ता है, बल्कि यह निरर्थक भी है! ==
इसे दूसरे के साथ कड़ाई से समान बनाने के लिए एक और ऑपरेटर बनाने का क्या मतलब है ===
?
निष्कर्ष
ढीले समानता ऑपरेटर ==
बहुत उपयोगी हो सकते थे यदि यह कुछ मौलिक गणितीय कानूनों का पालन कर रहे थे। लेकिन जैसा कि यह दुख की बात है, इसकी उपयोगिता ग्रस्त है।