2009-01-20 19 views
16

मैं कुछ डिबगिंग और जावास्क्रिप्ट में कुछ विचित्रता की खोज की थी:गर्भित स्ट्रिंग तुलना, 0 = '' है, लेकिन 1 = '1'

alert(1=='') ==> false 
alert(0=='') ==> true 
alert(-1=='') ==> false 

यह मतलब होता है कि एक गर्भित स्ट्रिंग तुलना कि 0 चाहिए = ' 0 '। यह सभी गैर-शून्य मानों के लिए सच है, लेकिन शून्य के लिए क्यों नहीं?

उत्तर

18

Javascript Comparison Operators

पर मोज़िला प्रलेखन के अनुसार दो ऑपरेंड एक ही प्रकार के नहीं हैं, जावास्क्रिप्ट ऑपरेंड तो धर्मान्तरित सख्त तुलना लागू होता है। यदि ऑपरेंड नंबर या बूलियन है, तो ऑपरेशंस संख्याओं में कनवर्ट किया गया है; यदि या तो संकार्य एक स्ट्रिंग है, एक दूसरे को एक स्ट्रिंग

में बदला क्या वास्तव में हो रहा है कि तार को संख्याओं में रूपांतरित किया जा रहा है है। उदाहरण के लिए:

1 == '1'1 == Number('1') हो जाता है 1 == 1 हो जाता है: true

फिर कोशिश इस एक: true अगर वे तार होते जा रहे थे, तो आप '1' == '1.' प्राप्त होता है, जो गलत होगा: 1 == '1.'1 == Number('1.')1 == 1 हो जाता हो जाता है ।

यह सिर्फ इतना है कि Number('') == 0, इसलिए 0 == '' सच है

2

PHP की तरह जावास्क्रिप्ट को कमजोर टाइप किया गया है *। तो जब आप 0 से '' की तुलना करते हैं, तो जेएस इंजन उन्हें समान डेटाटाइप में बदल देता है। चूंकि 0 और '' दोनों बूलियन (झूठी) के बराबर हैं, "झूठी == झूठी" सच है।

* कमजोर टाइप की गई भाषाओं को चर के किसी भी विशिष्ट डेटा प्रकार की आवश्यकता नहीं होती है, इसलिए आप एक वैरिएबल को एक स्ट्रिंग के रूप में सेट कर सकते हैं, इसे int, float, और स्ट्रिंग पर वापस प्रोसेसर फेंकने के बिना स्ट्रिंग में बदल सकते हैं।

+0

+1 बहुत अच्छा - क्या आप जानते हैं कैसे इंजन निर्णय करता है जो डेटाप्रकार कन्वर्ट करने के लिए करते हैं? स्पष्ट रूप से 0 को एक स्ट्रिंग में कनवर्ट करने के समान परिणाम नहीं होंगे। –

+0

यह गलत है - '' 0 में परिवर्तित हो जाएगा, बूलियन 'झूठी' – Christoph

+0

नहीं, मुझे यकीन नहीं है। मुझे संदेह होगा कि यह एक संख्यात्मक प्रकार है, या एक बुलियन कास्ट है। – davethegr8

3

यह जावास्क्रिप्ट समझौता में गया वास्तव में एक भयानक मैंगल्स में से एक है। '' और 0 दोनों अनियमित मान (बूलियन झूठे के बराबर) हैं, और इसलिए, बराबर हैं।

इस तरह की अजीब बग से खुद को बचाने के लिए, हमेशा === ऑपरेटर का उपयोग करना बेहतर होता है।

+0

0 और '' प्रारंभिक मूल्य नहीं हैं । वे मूल्य हैं जो तुलनात्मक रूप से तुलना करते समय समान मूल्य में रूपांतरित होते हैं। –

10

जब जावास्क्रिप्ट निहित प्रकार रूपांतरण करता है, खाली स्ट्रिंग अक्षर 0 पूर्णांक से मेल खाता है। इस तरह से अपनी तुलना करते हैं और आप अपने अपेक्षित परिणाम मिल जाएगा:

alert(1==='') ==> false 
alert(0==='') ==> false 
alert(-1==='') ==> false 
+0

+1 क्योंकि यह उत्तर वास्तव में एक समाधान है! – NLemay

2

कई भाषाओं में, खाली स्ट्रिंग गलत पर मजबूर किया जा सकता है।

साथ तुलना करते समय सावधान रहें == बजाय === की:

alert('' == '0'); //false 
alert(0 == ''); // true 
alert(0 =='0'); // true 

== सकर्मक नहीं है।

4

ECMA-262, 3 संस्करण, 11.9.3 x == y के बारे में, कदम 16:

हैं प्रकार (एक्स) संख्या और प्रकार (वाई) स्ट्रिंग है, की तुलना एक्स परिणाम लौट == ToNumber (y)।

खाली स्ट्रिंग '' तुलना से पहले 0 में परिवर्तित हो जाती है।

+1

+1 लेकिन spec cite को एक लिंक बनाना अच्छा होगा – Greg

+0

@RoBorg: लिंकिंग पीडीएफ के साथ काम नहीं करती है, और ईसीएमए -262 गुगलिंग और पहले लिंक पर क्लिक करना असुविधाजनक नहीं है .. – Christoph

+0

@ क्रिस्टोफ न तो "जावास्क्रिप्ट समानता ऑपरेटर" के लिए googling लेकिन यह बिंदु – Greg

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