मैं एक कोड उदाहरण पर ठोकर खाई, जो इस तुलना का उपयोग कर रहा था:
var someVar = 0;
Object.is(false, someVar); //Returns false
मुझे पता false == 0
है true
कि यही कारण है कि हमारे पास है ===
।
कैसे Object.is
अलग है ===
?
मैं एक कोड उदाहरण पर ठोकर खाई, जो इस तुलना का उपयोग कर रहा था:
var someVar = 0;
Object.is(false, someVar); //Returns false
मुझे पता false == 0
है true
कि यही कारण है कि हमारे पास है ===
।
कैसे Object.is
अलग है ===
?
जवाबों:
===
जावास्क्रिप्ट में सख्त तुलना ऑपरेटर कहा जाता है। Object.is
और सख्त तुलना ऑपरेटर बिल्कुल वैसा ही व्यवहार करता है, सिवाय NaN
और +0/-0
।
MDN से:
Object.is()
विधि===
ऑपरेटर के अनुसार समान होने के समान नहीं है ।===
ऑपरेटर (और==
साथ ही ऑपरेटर) संख्या मूल्यों -0 और +0 बराबर के रूप में व्यवहार करता है और व्यवहार करता हैNumber.NaN
के रूप में करने के लिए बराबर नहींNaN
।
नीचे दिए गए कोड में ===
और के बीच अंतर पर प्रकाश डाला गया है Object.is()
।
console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true
console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true
console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true
आप यहां और उदाहरण पा सकते हैं ।
नोट : Object.is
ECMAScript 6 प्रस्ताव का हिस्सा है और अभी तक व्यापक रूप से समर्थित नहीं है (उदाहरण के लिए यह किसी भी तरह के इंटरनेट एक्सप्लोरर या अन्य ब्राउज़रों के कई पुराने संस्करणों द्वारा समर्थित नहीं है)। हालाँकि आप गैर-ईएस 6 ब्राउज़रों के लिए एक पॉलीफ़िल का उपयोग कर सकते हैं जो ऊपर दिए गए लिंक में पाया जा सकता है।
.x
String
document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
विनिर्देशन के सेमवैल्यू एल्गोरिथ्म===
का उपयोग करता है , जबकि स्ट्रिक्ट इक्वेलिटी एल्गोरिथम का उपयोग करता है । सख्त समानता एल्गोरिथ्म पर एक नोट अंतर को बुलाता है:
यह एल्गोरिथ्म हस्ताक्षरित शून्य और NaNs के उपचार में सेमवैलू एल्गोरिथम ... से भिन्न होता है।
ध्यान दें कि:
NaN === NaN
गलत है, लेकिन Object.is(NaN, NaN)
सच है+0 === -0
सच है, लेकिन Object.is(+0, -0)
गलत है-0 === +0
सच है, लेकिन Object.is(-0, +0)
गलत हैजावास्क्रिप्ट में कम से कम चार प्रकार की "समानता" है:
==
), जहां ऑपरेंड को मैच करने के लिए प्रयास करने के लिए मजबूर किया जाएगा। नियम स्पष्ट रूप से निर्दिष्ट हैं , लेकिन गैर-स्पष्ट हैं। ( "" == 0
है true
, "true" == true
है false
, ...)।===
), जहां अलग-अलग प्रकारों के ऑपरेंड को ज़ब्त नहीं किया जाएगा (और बराबर नहीं होगा), लेकिन नोट के बारे में NaN
सकारात्मक और नकारात्मक शून्य देखें।Object.is
)।SameValue
को छोड़कर +0
और -0
एक ही के बजाय अलग हैं (द्वारा प्रयोग किया जाता Map
चाबी के लिए, और से Array.prototype.includes
)।ऑब्जेक्ट समतुल्यता भी है , जो भाषा या रनटाइम द्वारा प्रदान नहीं की जाती है, लेकिन आमतौर पर इसके रूप में व्यक्त की जाती है: वस्तुओं में समान प्रोटोटाइप, समान गुण होते हैं, और उनकी संपत्ति का मान समान होता है ("उसी" की कुछ उचित परिभाषा द्वारा) )।
- यदि टाइप (x) टाइप (y) से अलग है, तो गलत लौटें।
- यदि टाइप (x) संख्या है, तो
- यदि x NaN है और y NaN है, तो सही लौटें।
- यदि x +0 है और y -0 है, तो गलत लौटें।
- यदि x -0 है और y +0 है, तो गलत लौटें।
- यदि x y के समान संख्या मान है, तो सही लौटें।
- विवरण झूठा है।
- सेमवैल्यूएनॉननंबर (x, y) वापस करें।
... जहां SameValueNonNumber है:
- मुखर: प्रकार (x) संख्या नहीं है।
- जोर: टाइप (x) टाइप (y) के समान है।
- यदि टाइप (x) अपरिभाषित है, तो सही लौटें।
- यदि टाइप (x) शून्य है, तो सही लौटें।
- यदि टाइप (x) स्ट्रिंग है, तो
- यदि x और y कोड इकाइयों (समान लंबाई और समान सूचकांकों पर समान कोड इकाइयाँ) के समान क्रम हैं, तो वापस लौटें; अन्यथा, झूठे लौटें।
- यदि टाइप (x) बूलियन है, तो
- यदि x और y दोनों सत्य हैं या दोनों असत्य हैं, तो सत्य लौटें; अन्यथा, झूठे लौटें।
- यदि Type (x) Symbol है, तो
- यदि x और y दोनों समान प्रतीक मान हैं, तो सही लौटें; अन्यथा, झूठे लौटें।
- यदि x और y समान ऑब्जेक्ट मान हैं, तो सही लौटें। नहीं तो झूठा लौट आता है।
- यदि टाइप (x) टाइप (y) से अलग है, तो गलत लौटें।
- यदि टाइप (x) संख्या है, तो
- यदि x NaN है, तो गलत लौटें।
- यदि y NaN है, तो गलत लौटें।
- यदि x y के समान संख्या मान है, तो सही लौटें।
- यदि x +0 है और y -0 है, तो सही लौटें।
- यदि x -0 है और y +0 है, तो सही लौटें।
- विवरण झूठा है।
- सेमवैल्यूएनॉननंबर (x, y) वापस करें।
Object.is = function(v1, v2){
//test for `-0`
if(v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
//test for `NaN`
if(v1 !== v1) {
return v2 !== v2;
}
//everything else
return v1 === v2;
}
उपरोक्त पॉलीफ़िल फ़ंक्शन यह दिखाने के लिए है कि कैसे Object.is
काम करता है, किसी के लिए भी जो जानने के इच्छुक हैं। यू-डोंट-नो-जेएस का संदर्भ
Object.is()
समारोह तर्क के रूप में 2 मानों का उपयोग करके सच रिटर्न अगर 2 दिए गए मान ठीक उसी हैं, अन्यथा यह अवास्तविक लौटाते हैं।
आप सोच सकते हैं, हमारे पास पहले से ही ===
ऑपरेटर के साथ जावास्क्रिप्ट में सख्त समानता (चेक प्रकार + मूल्य) की जाँच है , हमें इस फ़ंक्शन की आवश्यकता क्यों है? अच्छी तरह से सख्त समानता कुछ मामलों में पर्याप्त नहीं है और वे निम्नलिखित हैं:
console.log(NaN === NaN); // false
console.log(-0 === +0); // true
Object.is()
इन मूल्यों की तुलना करने में सक्षम होने में हमारी मदद करता है कि क्या वे समान हैं, कुछ सख्त समानता ऑपरेटर नहीं कर सकते हैं।
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(-0, 0)); // false
console.log(Object.is(+0, +0)); // true
console.log(Object.is(+0, -0)); // false
संक्षेप में, वे समान हैं, लेकिन Object.is
चालाक और अधिक सटीक हैं ...
आइए इसे देखें ...
+0 === -0 //true
लेकिन यह पूरी तरह से सही नहीं है क्योंकि यह अनदेखा -
और +
पहले ...
अब हम उपयोग करते हैं:
Object.is(+0, -0) //false
जैसा कि आप देखते हैं, यह तुलना करने के लिए अधिक सटीक है।
इसके अलावा NaN
, सही होने की तरह अधिक काम करता है, जैसा कि कोई भी विचार NaN
करता है।