2012-08-27 17 views
15

मैं एक सहकर्मी को समझा रहा था कि आपको === और !== (और >== और <== बेशक) का उपयोग करना चाहिए, जब जावास्क्रिप्ट में चर की तुलना करते हैं ताकि यह तर्कों को सहारा न सके और सभी फ्रूपी और भ्रमित हो जाएं लेकिन उन्होंने मुझे दो भाग पूछा सवाल है कि मैं करने के लिए इस सवाल का जवाब नहीं जानते हैं और सोचा था कि मैं विशेषज्ञों यहाँ पूछना होगा किया था, विशेष रूप से यह है:जावास्क्रिप्ट समानता ट्रिपल बराबर है लेकिन इससे अधिक और उससे कम के बारे में क्या है?

> और < के बारे में क्या - क्यों नहीं है - जब वे वे भी बहस या नहीं मजबूर करते हैं की तुलना वहाँ >> और << ऑपरेटर के कुछ प्रकार (शायद कुछ अन्य वाक्यविन्यास होने की आवश्यकता है क्योंकि मुझे लगता है कि वे थोड़ा शिफ्ट ऑपरेटर होंगे यदि मैं पूरे सी शैली के साथ जा रहा है लेकिन आप gist मिलता है)?

तो मैं पहले भाग के लिए जवाब खोजने के लिए एक परीक्षण लिख सकते हैं, जो मैंने किया था, यहाँ यह है:

// Demo the difference between == and === 
alert(5 == "5"); 
alert(5 === "5"); 

// Check out what happens with > 
alert(5 > "4");  
alert(5 > 4); 

और यह दिखाई:

true 
false 

true 
true 

तो यह होता है >> "4" और > 4 के बाद से एक ही परिणाम लौटने के बाद मजबूर कर रहा है। तो दूसरे भाग के बारे में कैसे ...

क्या > और < के लिए कुछ प्रकार का ऑपरेटर है जो प्रकार को कॉरर्स नहीं करता है (या मैं परीक्षण को सुरक्षित रूप से करने के लिए अपना परीक्षण कैसे बदल सकता हूं)?

+3

वास्तव में वर्णन किए गए उत्तरों के कारण जावास्क्रिप्ट में '> ==' या '<==' नहीं है। [तुलना ऑपरेटर] देखें (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) –

उत्तर

13

नहीं, ऐसे ऑपरेटरों की कोई आवश्यकता नहीं है। उन संबंधपरक ऑपरेटरों के लिए किए गए प्रकार की जांच समानता और असमानता के मुकाबले अलग है। (संपादित — शायद यह है कि "कोई जरूरत नहीं" कहने के लिए एक छोटे से मजबूत है, यह सच ही है, क्योंकि जावास्क्रिप्ट यह समझे तो :-)

विशेष रूप से, > और < और >= और <= ऑपरेटरों सब काम करते हैं या तो दो पर संख्यात्मक मान, या दो तार, संख्यात्मक मान पसंद करते हैं। यही है, यदि एक मान एक संख्या है, तो दूसरे को एक संख्या के रूप में माना जाता है। यदि एक गैर-संख्या को किसी संख्या में साफ़ रूप से परिवर्तित नहीं किया जा सकता है (यानी, यदि यह NaN के रूप में समाप्त होता है), तो तुलना का परिणाम undefined है। फिर एक collating-आदेश स्ट्रिंग तुलना बजाय किया जाता है (यही कारण है कि एक छोटे से समस्याग्रस्त है, क्योंकि undefined एक if बयान के संदर्भ में false तरह दिखेगा है।)

दोनों मानों को स्ट्रिंग्स कर रहे हैं,।

यदि आप इसके बारे में सोचते हैं, तो ये तुलना वस्तु के उदाहरणों के लिए कोई समझ नहीं लेती है; किसी ऑब्जेक्ट के लिए दूसरे से "बड़ा" होने का क्या अर्थ है? मुझे लगता है, शायद, इसका मतलब यह है कि यदि आप खुद को इस प्रकार की तुलना में भिन्न प्रकार के मूल्यों के साथ ढूंढ रहे हैं, और इससे समस्याएं पैदा हो रही हैं, तो हाँ आपको स्थिति का पता लगाना होगा। ऐसा लगता है कि अपस्ट्रीम काम करना अच्छा होगा और इस बारे में सोचना होगा कि इस तरह की स्थिति के लिए कोड के बारे में कुछ गड़बड़ है या नहीं।

+0

एघ, इमोटिक्लोजिंग-ब्रैथेसिकॉन ..! >। <(लेकिन वैसे भी +1।) –

+0

@ डेविड थॉमस क्षमा करें लेकिन यह मेरे "जॉली एसओ प्रतिभागी" व्यक्तित्व – Pointy

+0

'true> = 1' का सच है :(लेकिन मुझे लगता है कि यह == ऑपरेटर से कम परेशान है। – Alex

8

वहाँ> और < के लिए ऑपरेटर किसी प्रकार का है कि प्रकार विवश नहीं है

नंबर है

मैं अपने परीक्षण कैसे बदल सकते हैं परीक्षण सुरक्षित रूप से

कि स्पष्टत प्रकार का परीक्षण करने के लिए होगा प्रदर्शन करने के लिए:

typeof a === typeof b && a > b 
1

मैं फ्लानागन का JavaScript संदर्भित: यह निश्चित गाइड (5 वीं एड ।) और ऐसा लगता है कि गैर-जबरदस्त तुलना ऑपरेटर नहीं हैं।

आप < < कह रहे हैं और >> वास्तव में बिटवाई ऑपरेटर हैं जो काम नहीं करेंगे।

मैं तुम्हें जान-बूझकर मूल्यों अपने आप विवश सुझाव है: दूसरों

var num_as_string = '4'; 
var num = +num_as_string; 
if (5 > num) { ... } 
+0

क्या '+ 'वाक्यविन्यास का मतलब' var num = + num_as_string; '? –

+1

@YatharthROCK: यह यूनरी प्लस ऑपरेटर है और एक मान को किसी संख्या में परिवर्तित करता है: https://developer.mozilla.org/en-US/docs /JavaScript/Reference/Operators/Arithmetic_Operators#-_.28Unary_Negation.29 –

0
12 > '100' // false 
'12' > 100 // false 
'12' > '100' // true 

के रूप में उल्लेख किया है, अगर एक एक नंबर अन्य एक नंबर करने के casted है है। एक ही नियम के रूप में अच्छी तरह से इन मामलों पर लागू होता है:

null > 0 // false 
null < 0 // false 
null >= 0 // true 

हालांकि, वहाँ मामलों है कि आप null >= 0 की आवश्यकता होगी false (ऊपर संख्या स्ट्रिंग तुलना से किसी मामले या) देने के लिए हो सकता है, इसलिए यह वास्तव में एक की जरूरत है सख्त तुलना >== या <== है।

उदाहरण के लिए, मैं Array.prototype.sort() के लिए एक compareFunction लिख रहा हूँ और x>=0 की तरह एक अभिव्यक्ति 0 की तरह null मूल्यों का इलाज और उन्हें एक साथ रखा है, जबकि मैं उन्हें कहीं और रखना चाहते हैं। मुझे उन मामलों के लिए अतिरिक्त तर्क लिखना है।

जावास्क्रिप्ट का कहना है कि इसे अपने आप (अभ्यास में) से सौदा करें।

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