5

यहाँ नौकरी के साक्षात्कार से पहले जावास्क्रिप्ट ऑनलाइन परीक्षण में सवालों में से एक है तुलना a == b बनाने के लिए true होने के लिए? (जैसे console.log(a == b) // true)ऑब्जेक्ट्स 'ए == बी` की तुलना कैसे करें सच होने के लिए?</p> <pre><code>function F(){}; var a = new F(); var b = new F(); </code></pre> <p><strong>क्यू</strong>:

मैंने जवाब है कि यह असंभव है क्योंकि a और bF के दो विभिन्न उदाहरण हैं और गैर-पुरातन के मामले में जे एस में बराबर तुलना संदर्भ तुलना करती है।

लेकिन कुछ समय पहले मैंने एक्सेल रौशमेयर द्वारा "जावास्क्रिप्ट में नकली ऑपरेटर ओवरलोडिंग" लेख पढ़ा है: http://www.2ality.com/2011/12/fake-operator-overloading.html - और मुझे आश्चर्य है कि वस्तुओं की तुलना में नकली ऑपरेटर अधिभार के लिए हैक है या नहीं?

+4

से नई को हटाने के द्वारा 'JSON.stringify (एक) == JSON.stringify (ख)' –

+0

@roasted, वास्तव में नहीं। विषय में आपने उत्तर दिया है कि सही तरीके से वस्तुओं की तुलना कैसे करें। यहाँ एक और मामला है। – jsguff

+0

@jsguff क्षमा करें, बस शीर्षक पढ़ें मैं जल्दबाजी के निष्कर्ष पर आया –

उत्तर

5

यह वास्तव में इस बात पर निर्भर करता है कि "तुलना कैसे करें == बी सच होने के लिए?"

आप निर्माता को बदलने की अनुमति कर रहे हैं, तो आप अपने निर्माता एक सिंगलटन कर सकता है:

function F(){ 
    if (!F.instance) { 
     F.instance = this; 
    } else { 
     return F.instance; 
    } 
}; 
var a = new F(); 
var b = new F(); 
if (a === b) { 
    //they are the same 
} 

वे तुम्हें सब कुछ रखने के लिए के रूप में यह है, लेकिन एक तुलना है है चाहते हैं कि a == b तो शामिल आप कर सकते थे निम्नलिखित लिखें:

if ("" + a == b) { 
} 

वे निर्धारित करते हैं कि दो वस्तुओं एक ही निर्माता समारोह के उदाहरण हैं के तरीके जानना चाहते हैं, तो आप constructor संपत्ति यातुलना कर सकते हैंसंपत्ति:

if (a.constructor === b.constructor) { 
} 

if (a.__proto__ === b.__proto__) { 
} 

वे जानना चाहते हैं dermine के तरीकों इन दो वस्तुओं एक ही गुण होते हैं कि क्या चाहते हैं, आप उनके JSON स्ट्रिंग तुलना कर सकते हैं या तो:

if (JSON.stringify(a) === JSON.stringify(b)) { 
} 

या आप एक समारोह है कि रिकर्सिवली तुलना लिखना दोनों वस्तुओं में सभी गुण (गहरी तुलना)।

और सवाल का सबसे सरल जवाब "कैसे तुलना करने के लिए एक == ख सच?":

var a = new F(); 
var b = new F(); 

b = a; 

if (a === b) { 
    //surprise!!! 
} 
+0

' a === b' झूठा देता है! अन्य ठीक काम कर रहे हैं – CME64

+0

@ सीएमई 64 मेरे लिए ठीक काम करता है: http://jsfiddle.net/hL3fA/ – basilikum

+0

अजीब, क्या चल रहा है ?, इसे जांचें: http://jsbin.com/okinob/3/edit – CME64

0

मेरे सबसे अच्छे जवाब यह होगा जब से तुम विभिन्न कार्यों की तुलना कर सकते हैं:

console.log(a.constructor+"" === b.constructor+""); 

क्योंकि यह स्ट्रिंग के रूप में कार्य करता है और फिर उन्हें सचमुच तुलना करता है।

उदाहरण परीक्षण:

function f1(){} 
function f2(){} 
var a = new f1(), 
    b= new f2(); 
console.log(a.constructor+"" === b.constructor+""); 
b = new f1(); 
console.log(a.constructor+"" === b.constructor+""); 

DEMO

ध्यान दें: === संकेत तीसरे के रूप में की जरूरत नहीं है प्रकार की तुलना के लिए किया जाएगा और दोनों उस बिंदु पर तार तो == का उपयोग कर वास्तव में क्या करना होगा रहे हैं वही बात

संपादित करें: प्रश्न के मेरे वास्तविक उत्तर हालांकि wo uld हो: प्रारंभ

+0

हमें ** सचमुच ** 'console.log (a == b) // => true' चाहिए। उस मामले में '.__ proto__', न ही' .constructor', न ही 'JSON.stringify (कोई भी)' – jsguff

+0

@jsguff, क्या आपको लगता है कि आपको 'a = a.constructor + "जोड़ना चाहिए; बी = .. '' console'log से पहले (एक == बी); 'सचमुच स्थिति को रखने के लिए? – CME64

+0

हुह, क्यों नहीं 'ए = 42; बी = 42'? :) मुझे लगता है कि वे (परीक्षण के लेखक) का अर्थ वास्तव में 'सिंगलटन' पैटर्न है, क्योंकि यह सचमुच बराबर तुलना करने के लिए एकमात्र तरीका है 'ए == बी'' सत्य 'होना। – jsguff

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

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