2011-01-07 16 views
5

खाली JavaScript श्रृंखला पर विचार करें? नियम क्या हैं?जावास्क्रिप्ट प्रकार कास्टिंग

+1

संभावित डुप्लिकेट [क्यों चेतावनी (!! "0") और चेतावनी (झूठी == "0") दोनों आउटपुट जावास्क्रिप्ट में सच है] (http://stackoverflow.com/questions/4567393/why-do -alert0-and-alertfalse-0-दोनों-आउटपुट-सत्य-इन-जावास्क्रिप्ट) – SLaks

+1

पॉइंटिंग के लिए धन्यवाद। लेकिन वास्तव में, मैं सामान्य नियमों के लिए पूछता हूं। – Evgenyt

+2

जब ढीले '==' ऑपरेटर की बात आती है, तो नियम इतने सामान्य नहीं होते हैं।आपको [इस उत्तर] द्वारा संदर्भित सार समानता तुलना एल्गोरिदम के माध्यम से पढ़ना चाहिए (http://stackoverflow.com/questions/4626361/javascript-type-casting/4626420#4626420)। – user113716

उत्तर

12

http://forums.whirlpool.net.au/archive/966449 से:

a == false:

इस मामले में, बाएं हाथ की ओर के प्रकार वस्तु है, दाएँ हाथ की ओर के प्रकार बूलियन है। जावास्क्रिप्ट पहले बूलियन को एक संख्या में परिवर्तित करता है, जो 0 प्रदान करता है। फिर यह ऑब्जेक्ट को "आदिम" में परिवर्तित करता है, जो खाली स्ट्रिंग प्रदान करता है। इसके बाद यह खाली स्ट्रिंग की तुलना 0 से करता है। खाली स्ट्रिंग को एक संख्या में परिवर्तित किया जाता है, जो 0 प्रदान करता है, जो संख्यात्मक रूप से 0 के बराबर है, इसलिए संपूर्ण अभिव्यक्ति का परिणाम true है।

सभी गोरी विवरणों के लिए ECMAScript spec के §11.9.3 देखें।

(!a):

इस मामले में जावास्क्रिप्ट बूलियन सच करने के लिए वस्तु बदल देता है, तो यह उलट, झूठी हो जाती है।

+0

+1 अच्छा और सही उत्तर (या मुझे लगता है कि एक सही उत्तर का संदर्भ)। – user113716

+0

यहां उल्लिखित ईसीएमए स्पेक का सीधा लिंक है: http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 – JKirchartz

8

! ऑपरेटर जांचता है कि इसका ऑपरेंड "झूठा" है या नहीं।

निम्नलिखित सत्य हैं:

  • !false
  • !0
  • !null
  • !NaN
  • !undefined
  • !""

ढीला समानता है, जो falsiness साथ कोई संबंध नहीं है के लिए == ऑपरेटर जाँच करता है।

विशेष रूप से, a == b संचालन संख्याओं में कनवर्ट करेगा, फिर संख्याओं की तुलना करें।
संख्या वाले तारों में संख्याओं को परिवर्तित किया गया है जिनमें वे शामिल हैं; बूलियन 0 और 1 में परिवर्तित हो जाते हैं।
यदि परिभाषित किया गया है तो valueOf पर कॉल करके ऑब्जेक्ट्स को परिवर्तित किया जाता है।

इस प्रकार, निम्न में से सभी सत्य हैं:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true
+0

+1 आपने मुझे इसे हराया! –

+2

कैसे हैं ("2"! = सच), ("2"! = झूठा) दोनों सच हैं? – qwertymk

+2

@qwerty: वही तरीका है कि '2! = 3' और' 2! = 4' दोनों सच हैं – SLaks

1

जब == ऑपरेटर के माध्यम से एक आदिम मूल्य के लिए एक वस्तु की तुलना, वस्तु एक आदिम मूल्य ही (संख्या या स्ट्रिंग) में coerces। में इस मामले []0 में coerces, तो false0 में coerces:

[] == false 
0 == false 
0 == 0 

जो सच है।

! ऑपरेटर बूलियन में प्रवेश करता है और फिर मूल्य को बदल देता है। [] बूलियन में true (किसी भी वस्तु के साथ) है। तब false

![] 
!true 
false 
4

== ऑपरेटर बनने के लिए उलटने जब ऑपरेंड में से एक है, तो बूलियन, अन्य संख्या को टाइप बदल देता है।

[] == 0; 

बराबर है करने के लिए:

0 == 0; 

आप विनिर्देश पर The Abstract Equality Comparison Algorithm का पूरा विवरण देख सकते हैं।

आप देख सकते हैं, एक खाली सरणी वस्तु, जब संख्या में परिवर्तित, 0 पैदा करता है:

+[]; // 0 
Number(0); 

यह वास्तव में, क्योंकि इसके toString विधि एक खाली स्ट्रिंग का उत्पादन होता है उदाहरण के लिए:

[].toString(); // "" 

+""; // 0 
Number(""); // 0 
+0

+1 इसे समझाने का अच्छा तरीका, टाइप रूपांतरणों के माध्यम से आगे बढ़ना। – user113716

0

यह सुनिश्चित नहीं है कि यह प्रश्न का उत्तर देता है, लेकिन जावास्क्रिप्ट के टाइपकास्टिंग अजीबता के आसपास होने के लिए एक नई लाइब्रेरी है:

Typecast.js

एक वाक्य में, टाइपकास्ट सभी साधारण समस्याओं को हल करता है, ताकि आप बड़े लोगों पर ध्यान केंद्रित कर सकें। टाइपकास्ट जावास्क्रिप्ट में दृढ़ता से टाइप किए गए चर के लिए एक पूर्ण मंच बनाकर जावास्क्रिप्ट के साथ क्या गलत है।

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