2012-01-19 21 views
5

अगर मैं निष्पादित FireBug में निम्नलिखित स्निपेट को सांत्वना यह किसी भी तरह प्रिंट surprise!:जावास्क्रिप्ट: अजीब तुलना व्यवहार

['surprise!', 'boring'][Number(0=="​")] 

लेकिन क्यों?

युपीडी

मैं माफी चाहता, लोगों को कर रहा हूँ, कि एक मजाक था! जेरे सबसे पहले देखा जो! कल मैं एक स्ट्रिंग में एक ZERO WIDTH SPACE पाया, और फिर प्रलोभन के बाद से पड़ा = कुछ मस्ती करने के लिए)

+0

आपका मतलब है 'surprize!' सही? – Jere

+0

@ मिचा, ध्यान दें '== ', नहीं' ===' – newtover

+0

नहीं, उसकी फायरबग गलतियों को पहचानती है और उन्हें ठीक करती है। – shift66

उत्तर

9

के बीच आपके उद्धरण के बीच एक अतिरिक्त, गैर दृश्यमान, चरित्र है।

आप इस बाहर लिखते हैं, तो आप क्योंकि 0 == "" सच, संख्या का आकलन करती 'उबाऊ' मिल जाएगा (सही) के लिए 1.

evalutes इन दो चिपकाएं और भिन्न उत्पादन देखने के लिए:

0=="​" 

आउटपुट झूठी

0=="" 

आउटपुट सच

एकमात्र चीज जो मैंने बदल दी है वह "" के बीच चरित्र को हटा रहा है।

+0

+1 के अधिक वोट के लायक हैं। एक पल के लिए, मैंने सोचा कि कंसोल खराब हो गया था। अच्छा! – cheeken

+0

क्या धोखाधड़ी है ... – Raynos

+1

हाँ, जेरे सही है। लाइन को कॉपी और पेस्ट करें, फिर कीबोर्ड तीर के साथ आगे बढ़ें और आपको एक अतिरिक्त स्टॉप दिखाई देगा। यह बहुत छोटी जगह हो सकती है – welldan97

8

0=="​"false (है क्योंकि आप स्ट्रिंग) में एक गैर मुद्रण चरित्र है, Number(false) है 0 (प्रति page 34 of the spec के रूप में), और "आश्चर्य" सरणी की 0 वीं अनुक्रमणिका है।

+0

आप मेरे दोस्त – Joe

4

ES5 11.9.3 The == operator

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

और

StringNumericLiteral की एमवी ::: [खाली] 0.

तो 0=="" रिटर्न 0 == ToNumber("") जो 0 == 0 जो सच है है।

== रूपांतरण नियम 0=="" तक true

ES5 15.7.1.1 Number (value) invokes ES5 9.3 toNumbertoNumber(true) === 1

और ["suprize!", "boring"][1] रिटर्न "boring" जो स्पष्ट रूप से गलत है।

यह सही क्यों है?क्योंकि

"​".charCodeAt(0) === 8203

आपका स्ट्रिंग शाब्दिक खाली स्ट्रिंग नहीं है। आपकी स्ट्रिंग में आपके पास zero width space है।

अब अगर हम ES5 11.9.3 == operator के लिए वापस जाओ हम

देखने के व्याकरण StringNumericLiteral

का एक विस्तार कौन सा

  • 0==""
  • 0==NaN का मतलब है के रूप में स्ट्रिंग की व्याख्या नहीं कर सकते
  • false
  • toNumber(false) === 0
  • Number(0=="") === 0
  • ["suprize!", "boring"][0] === "suprize!"
1

['surprise!', 'boring'][Number(0=="​")] वापस आ जाएगी अपने कोड क्योंकि 'उबाऊ':

Number(0=="​") //returns true 

लेकिन अपने कोड भिन्न है आप में एक अदृश्य चार है आपका पाठ, यही कारण है कि झूठी वापसी कर रहा है।

यदि आप सही ढंग से कोड लिखते हैं तो सत्य वापस आ जाएगा और परिणाम boring अपेक्षित होगा।

लेकिन अगर कॉपी और अपने कोड पेस्ट, अवास्तविक लौटाते हैं, यही कारण है कि आप के बीच "" (आप कीबोर्ड या का उपयोग कर जाँच कर सकते हैं "" .length)

तो अपने कोड अवास्तविक लौटाते हैं एक चार है है , वह 0 होगा तो 'आश्चर्य!'

आप धोखा दे रहे हैं आदमी: पी

['surprise!', 'boring'][Number(0=="​")] 

"​".length //returns 1 ;) 

"​" != "" // OH GOD THIS IS TRUE :P 
0

जब सांत्वना console.log में इस भाग गया (मैं उबाऊ मिल [ '! Surpeise', 'उबाऊ'] [संख्या (0 == "")])

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