2012-01-21 10 views
5

प्रश्न: क्या जावास्क्रिप्ट में समानता या पहचान का मूल्यांकन करते समय ऑपरेंड ऑर्डर कोई अंतर करता है?क्या जावास्क्रिप्ट में समानता या पहचान का मूल्यांकन करते समय ऑपरेंड ऑर्डर कोई अंतर करता है?

कोड में (0 == value)(value == 0) से तेज़ या अधिक सही है? (ध्यान दें कि यह प्रश्न पहचान ऑपरेटर, === के लिए समान रूप से मान्य है।)

चूंकि समानता और पहचान ऑपरेटर दोनों कम्यूटिव हैं, मुझे विश्वास नहीं है कि ऑपरेंड ऑर्डर को मूल्यांकन प्रदर्शन में अंतर करना चाहिए, जब तक कि कुछ अंतर्निहित न हो समानता एल्गोरिदम की गणना में बाईं ओर शाब्दिक लाभ। एकमात्र कारण मुझे आश्चर्य है कि मैं हाल ही में गूगल के Closure Compiler इस्तेमाल किया कुछ जावास्क्रिप्ट नीचे उबालने के लिए, और पाया है कि

if (array.length == 0 && typeof length === 'number') {

if(0 == b.length && "number" === typeof c) { को संकलित किया गया था।

दोनों समानता अभिव्यक्तियों में - एक ढीला और एक सख्त-क्लोजर ने मेरे ऑपरेटरों के आदेश को उलट दिया है, जिसमें संख्यात्मक अक्षर और उनके संबंधित अभिव्यक्तियों के बाईं ओर एक स्ट्रिंग अक्षर दिया गया है।

इससे मुझे उत्सुकता मिली।

मैं ECMAScript 5.1 Language Specification (खंड 11.9, पीपी। 80-82) और पाया, जबकि समानता एल्गोरिदम पहले बाएं हाथ ऑपरेंड का परीक्षण करके शुरू करते हैं, कोई संकेत नहीं है कि यह है कि यह तेज है या की समानता ऑपरेटर्स अनुभाग पढ़ते समय उस ऑपरेंड के रूप में एक शाब्दिक उपयोग करने के लिए बेहतर है।

क्या ईसीएमएस्क्रिप्ट की टाइप-जांच के बारे में कुछ है जो साक्षरता की परीक्षा को इष्टतम बनाता है? क्या यह क्लोजर कंपाइलर में कुछ ऑप्टिमाइज़ेशन क्विर्क हो सकता है? या शायद ईसीएमएस्क्रिप्ट की समानता एल्गोरिदम के पुराने संस्करण में एक कार्यान्वयन विस्तार जिसे spec के इस नए संस्करण में निरस्त कर दिया गया है?

+1

मुझे लगता है यह "त्रुटि" कैसे गूगल पारसर्स का एक पक्ष प्रभाव के रूप में आता है और अपने कोड पुनर्निर्माण और दुष्प्रभाव या का सही सत्ता के साथ कोई संबंध नहीं है फेंक होगा ऑपरेंड ऑर्डर – Raynos

+0

गति की जांच करने के लिए, बस [जेएस पेर्फ] (http://jsperf.com) पर परीक्षण चलाएं। यह निश्चित रूप से, केवल सैद्धांतिक/'उद्देश्य' मूल्यांकन की पेशकश करने के बजाए आपके द्वारा बनाए गए परीक्षण-मामलों को चलाने वाले ब्राउज़र को मापने के लिए होगा। –

उत्तर

1

http://jsperf.com/lr-equality

मैं वास्तव में आप एक स्पष्टीकरण दे सकते हैं, लेकिन आप संख्या देख सकते हैं। वे बराबर (अब) लगते हैं।

+0

हैलो, मेरे पास 'अधिक/कम' ऑपरेटरों के बारे में एक दिलचस्प सिद्धांत है। यह दिलचस्प हो सकता है अगर आप उन्हें भी जोड़ सकते हैं। उदाहरण के लिए '< 5 and 5 > ए' – ajax333221

+0

संख्याएं अतुलनीय हैं, हालांकि, केवल कच्चे डेटा को देखें: http: // jsperf।कॉम/एलआर-समानता – Blender

+0

इसे जांचने के लिए धन्यवाद। मैंने प्रदर्शन परीक्षण भी चलाए हैं, लेकिन सोचते हैं कि अंतर के लिए एल्गोरिदमिक कारण है क्योंकि यह जावास्क्रिप्ट प्रदर्शन में कुछ बड़ी प्रवृत्ति को इंगित कर सकता है। अनिवार्य रूप से, मैं यह निर्धारित करने की कोशिश कर रहा हूं कि प्रदर्शन अंतर के लिए कोई स्रोत कारण है या नहीं और क्या मैं आदत बदलकर अन्य प्रदर्शन लाभ प्राप्त कर सकता हूं। लेकिन मैं इनपुट की सराहना करता हूं! – piersadrian

2

बहुत से लोग स्टाइल सम्मेलन के रूप में दाईं तरफ परिवर्तनीय के साथ कोड करते हैं। मुख्य कारण यह मैला कोडिंग के साथ त्रुटियों को पकड़ सकता है।

निम्नलिखित कोड एक बग की संभावना है, लेकिन यदि कथन कथन का मूल्यांकन करेगा।

if(n = 1) { } 

और यह एक त्रुटि

if(1 = n) { } 
+2

@PiersMainwaring उन्होंने यह नहीं कहा कि यह एक * बग के सत्य * का मूल्यांकन करता है - उन्होंने कहा कि जब यह लिखा जाता है तो यह आमतौर पर * एक बग है, और एक तुलना का उद्देश्य था (एक असाइनमेंट के विपरीत)। वह आपके प्रश्न का उत्तर दे रहा है: यह एक प्रदर्शन की बात नहीं है, यह एक वर्ग की त्रुटियों को कम करने का एक तरीका है। –

+0

@ डेव न्यूटन आह, समझा। मैं समानता के मुद्दे पर ध्यान केंद्रित कर रहा था और जवाब को गलत तरीके से पढ़ता था। मैं क्षमाप्रार्थी हूं। – piersadrian

+0

तो, आप बंद कर रहे हैं क्लोजर कंपाइलर का उद्देश्य किसी प्रकार का क्यूए उपकरण भी हो सकता है? – katspaugh

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

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