2011-11-08 20 views
32

जावास्क्रिप्ट में, एक डबल बराबर (==) बनाम एक ट्रिपल बराबर (===) का उपयोग कर बनाम प्रदर्शन अंतर है?डबल बराबर (==) और ट्रिपल बराबर के बीच जावास्क्रिप्ट प्रदर्शन अंतर (===)

उदाहरण: if (foo == bar) बनाम if (foo === bar)

+20

कुछ भी नहीं, आप कभी भी नोटिस करेंगे। आगे बढ़ो। –

+2

वे विभिन्न उद्देश्यों की सेवा करते हैं, और "अधिक प्रदर्शन" उनमें से एक नहीं है। यह एक गैर-मुद्दा है, जब आप उनके द्वारा प्रदान की जाने वाली कार्यक्षमता प्राप्त करना चाहते हैं तो उनका उपयोग करें। – meagar

+0

अनुशंसित पढ़ने: [आप जेएस नहीं जानते] (https://github.com/getify/You-Dont-Know-JS/blob/master/types%20&%20grammar/ch4.md#loose-equals-vs -स्ट्रिट-बराबर) –

उत्तर

25

सख्त तुलना (===) की तुलना में अधिक बातों की जांच करने के लिए हमेशा थोड़ा तेज है, लेकिन the difference is usually negligible हो जाएगा है।

यदि आप निश्चित रूप से जानते हैं कि आपको तुलना में टाइप जबरन की आवश्यकता नहीं है तो यह निश्चित रूप से === को प्राथमिकता देने के लिए समझ में आता है। यह हमेशा कम से कम == जितना तेज़ होगा।

+3

मजेदार, क्योंकि '== 'beat' ===' मेरे लिए, दोनों बार मैंने एफएफ 7 पर परीक्षण चलाया। मैं सहमत हूं कि '===' तेज होना चाहिए, लेकिन परीक्षण अन्यथा दावा करता है। (शायद जावास्क्रिप्ट इंजन/सीपीयू लोड में विसंगति, जो जानता है) – Nightfirecat

+0

@ नाइटफायरकैट: यह दिलचस्प है। क्या आप चर या अक्षर की तुलना कर रहे थे? –

+0

मैं केवल इसका उपयोग किए गए डिफ़ॉल्ट परीक्षणों का उपयोग कर रहा था - अर्थात् "==/=== उसी प्रकार पर" परीक्षण, क्योंकि उनमें से किसी के सबसे तेज़ थे। मेरा मानना ​​है कि नियमित तुलना परीक्षणों के विपरीत सभी समान प्रकार की तुलना में एक ही पैटर्न दिखाया गया है, याद रखें। – Nightfirecat

3
प्रदर्शन के कारण

, मुझे लगता है कि ===, बेहतर प्रदर्शन किया है क्योंकि ===== तुलना में अधिक कड़ाई है,

उदा क्रोम कंसोल में निम्न का प्रयास करें।

> 1 == '1' 
    true 
> 1 === '1' 
    false 

=====

1

कुछ flimsy परीक्षणों से, ===== से थोड़ा तेज़ प्रतीत होता है।

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

संपादित करें: वास्तव में, आप/किस/आप तुलना कर रहे हैं और ब्राउज़र कार्यान्वयन पर निर्भर करते हैं। दूसरे शब्दों में, इसके बारे में चिंता न करें।

+1

'===' तेज है। किनारे के मामले हैं (आपको एक मिला)। हालांकि कोड अभ्यास/शैली मार्गदर्शिका से '===' हर बार – Raynos

+2

"इसके बारे में चिंता न करें" हाथों से हाथ जीतता है, "आपको संभवतः प्रदर्शन लाभ की आवश्यकता नहीं है"। आप इस उपयोगकर्ता के इरादे और इस प्रश्न के लिए यहां आने वाले सभी उपयोगकर्ताओं को नहीं जानते हैं। – cdosborn

+2

@cdosborn woah, हैलो 2011. यह क्यू SO पर nodejs टैग को पूर्व-दिनांकित करता है। हाँ आप सही हैं। उस समय यह एक उचित धारणा थी कि यह ब्राउज़र में था, और शेविंग मिलीसेकंड/लाखों मूल्यांकन होंगे .. आपके समय का बुरा उपयोग होगा। चीजें ~ 5 साल में बहुत कम हो गई हैं। – Hamish

38
  • प्रकार की तुलना में एक ही कर रहे हैं, वे समान हैं। यही कहना है कि वे सटीक उसी एल्गोरिदम का उपयोग करते हैं।

  • यदि प्रकार विभिन्न हैं, तो प्रदर्शन अप्रासंगिक है। या तो आपको टाइप जबरन की आवश्यकता है, या आप नहीं करते हैं। यदि आपको इसकी आवश्यकता नहीं है, तो == का उपयोग न करें क्योंकि आपको जो परिणाम मिल रहा है वह अप्रत्याशित हो सकता है।

14

संपादित करें: यहां संदर्भ के लिए डॉ एक्सल Rauschmayer http://www.2ality.com/2011/06/javascript-equality.html सच महान लिखने अप द्वारा कल्पना स्पष्टीकरण द्वारा है।

=== (सख्त समानता): केवल वही मान समान मानते हैं जो समान प्रकार के होते हैं।

  1. अपरिभाषित === अपरिभाषित, अशक्त === अशक्त,
  2. NaN खुद सहित कुछ भी नहीं ===,
  3. आदिम [संख्या | स्ट्रिंग | बूलियन] === आदिम मूल्य बराबर,
  4. === केवल स्वयं (एक ही सटीक इकाई)

== (उदार समानता)

01 आत्म (+0 === -0)
  • दो वस्तुओं [| | वस्तु समारोह सरणी] को
    1. यदि दोनों मानों का एक ही प्रकार है: === के साथ तुलना करें।
    2. अपरिभाषित == बातिल
    3. संख्या और स्ट्रिंग: स्ट्रिंग => संख्या और संख्या के लिए
    4. बूलियन और गैर बूलियन => गैर बूलियन तुलना और
    5. स्ट्रिंग या संख्या => एक वस्तु की तुलना: परिवर्तित वस्तु आदिम और तुलना करने के लिए।

    सभी आधुनिक जावास्क्रिप्ट वातावरण में वे पूरी तरह से लागू होते हैं। सरल शब्दों में, == प्राइमेटिव्स (स्ट्रिंग, संख्या, बूलियन) में दिए गए चर को परिवर्तित करके समानता के लिए परीक्षण करता है। सख्त समानता के लिए === परीक्षण, जिसका मतलब रूपांतरण के बिना सटीक वही ऑब्जेक्ट या आदिम मूल्य है।

    यदि आप objOne == objTwo क्या वास्तव में होता है [[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())

    valueOf के संकल्प को कुछ हद तक शामिल किया जा सकता है, जे एस और आंतरिक इंजन सामान में उजागर कार्यों के बीच उछल है। यह कहने के लिए पर्याप्त है कि तुलना हमेशा प्राइमेटिव के लिए दो मूल्यों के साथ खत्म हो जाएगी या एक त्रुटि फेंक दी जाएगी।

    संपादित करें:EQUALS वास्तव में STRICT_EQUALS पहले जो प्रक्रिया के बाकी preempts कोशिश करता है।

    दिलचस्प बात यह है कि valueOf (और इसके साथी टूस्ट्रिंग) अतिसंवेदनशील हैं। क्रोम में कोड का यह टुकड़ा चलाएं (मुझे लगता है कि कोई वेबकिट, यह सुनिश्चित नहीं है कि जेएससी और वी 8 इस बोली को साझा करते हैं)। यह अपने mindpiece उड़ा देगा:

    var actions = []; 
    var overload = { 
        valueOf: function(){ 
        var caller = arguments.callee.caller; 
        actions.push({ 
         operation: caller.name, 
         left: caller.arguments[0] === this ? "unknown" : this, 
         right: caller.arguments[0] 
        }); 
        return Object.prototype.toString.call(this); 
        } 
    }; 
    overload.toString = overload.valueOf; 
    overload == 10; 
    overload === 10; 
    overload * 10; 
    10/overload; 
    overload in window; 
    -overload; 
    +overload; 
    overload < 5; 
    overload > 5; 
    [][overload]; 
    overload == overload; 
    console.log(actions); 
    

    आउटपुट:

    [ { operation: 'EQUALS', 
        left: overload, 
        right: 10 }, 
        { operation: 'MUL', 
        left: overload, 
        right: 10 }, 
        { operation: 'DIV', 
        left: 'unknown', 
        right: overload }, 
        { operation: 'IN', 
        left: overload, 
        right: DOMWindow }, 
        { operation: 'UNARY_MINUS', 
        left: overload, 
        right: undefined }, 
        { operation: 'TO_NUMBER', 
        left: overload, 
        right: undefined }, 
        { operation: 'COMPARE', 
        left: overload, 
        right: 5 }, 
        { operation: 'COMPARE', 
        left: 'unknown', 
        right: overload }, 
        { operation: 'ToString', 
        left: 'unknown', 
        right: overload } ] 
    

    == और === के बीच अंतर का सार द्वारा === उस सूची में नहीं दिख रहा दर्शाया गया है। यह पूरी तरह से जावास्क्रिप्ट लैंड में यात्रा छोड़ देता है। प्रदर्शन की तुलना करते समय वह साहसिक महंगा है।

    हालांकि आपको इंजन अनुकूलन के लिए खाते की आवश्यकता है। अधिकांश वस्तुओं के लिए, इंजन अधिकांश चरणों में कटौती करने और मूल लैंड में रहने में सक्षम होगा और लगभग समान प्रदर्शन प्राप्त करेगा। लेकिन यह गारंटी नहीं है और यदि कुछ इंजन को ऑप्टिमाइज़ेशन का उपयोग करने में सक्षम होने से रोकता है, तो आपके कोड में कुछ फैंसीनेस या बिल्टिन या मुद्दों के असंख्य ओवरराइडिंग, तो आप तुरंत प्रदर्शन में परिणाम देखते हैं। === इसे मजबूर करता है।

    === जावास्क्रिप्ट में केवल एकमात्र अपरिवर्तनीय चीज़ है।

  • +0

    इसके लिए आपका सबूत कहां है? चूंकि ऑपरेशन एक ही प्रकार के होते हैं, इसलिए '==' और '===' ठीक उसी तरह काम करने के लिए निर्दिष्ट होते हैं, मैं विश्वास नहीं कर सकता कि जेएस वातावरण उन मामलों में उन्हें अलग-अलग लागू करेंगे। –

    +0

    .... क्या आपने पहली वाक्य के बाद मेरी कोई भी पोस्ट पढ़ी? मैं सचमुच वी 8 आउटपुट शामिल था। संक्षिप्त उत्तर: == कॉल === पहले और ऐसे मामलों में जहां === सच है अंतर अंतर नगण्य है। इसके अलावा == परिभाषा से खोना है। –

    +0

    और केवल पोस्टरिटी के लिए नोट करने के लिए। मेरा उपर्युक्त सबूत एक उपन्यास विधि है जिसके साथ मैं आया हूं जो आंतरिक जेएस इंजन ऑपरेटर फ़ंक्शन कॉलर्स और मनमाने ढंग से जावास्क्रिप्ट ऑब्जेक्ट्स से सही ढंग से स्थित ऑपरेशंस को पहचानने में सक्षम है, वी 8 या जावास्क्रिप्टकोर का उपयोग करके सभी मौजूदा कार्यान्वयन में, जिसे मैंने कहीं और नहीं देखा है, और जो सीधे जेएस में ऑपरेटर ओवरलोडिंग को सक्षम बनाता है जो अन्यथा असंभव है और वर्तमान में अन्यथा सफलतापूर्वक लागू नहीं किया गया है। –

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