2012-01-21 16 views
5

मैं रूबी और जावास्क्रिप्ट और पुरुष जैसी भाषाओं में कुछ विषमताएं के बारे में यह बहुत अजीब screencast कल देखा है पता चलता है कि:क्यों ऐरे + ऐरे खाली स्ट्रिंग के बराबर है?

[] + [] -> "" // returns empty string 

बहुत स्पष्ट नहीं ...

मैं करने के लिए जाने का फैसला किया गया है अधिक जानकारी प्राप्त करने के लिए ECMAscript language specification

11.6.1 अलावा ऑपरेटर (+)

अलावा ऑपरेटर या तो स्ट्रिंग संयोजन या संख्यात्मक अलावा करता है: मैं + ऑपरेटर कार्यान्वयन (p.75) जो कहते हैं के साथ शुरू कर दिया है।
उत्पादन AdditiveExpression: AdditiveExpression + MultiplicativeExpression का मूल्यांकन इस प्रकार किया जाता है:
1. AdditiveExpression का मूल्यांकन करने का परिणाम होने दें।
2. लैवल को GetValue (lref) दें।
3. Rref को गुणक एक्सपेरेशन का मूल्यांकन करने का नतीजा दें।
4. रावल को GetValue (rref) होने दें।
5. lprim को अपराधी (लालसा) दें।
6. rprim को अपराधी (रावल) होने दें।
7. यदि टाइप (एलप्रिम) स्ट्रिंग या टाइप (आरप्रिम) स्ट्रिंग है, तो
ए। स्ट्रिंग को वापस लौटाएं जो ToString (lprim) को टोनस्ट्रिंग (आरप्रिम)
8. को टोन नम्बर (lprim) और ToNumber (rprim) में अतिरिक्त ऑपरेशन लागू करने का परिणाम लौटाएं। 11.6.3 से नीचे नोट देखें।

नोट 1 चरण 5 और 6 में ToPrimitive को कॉल में कोई संकेत प्रदान नहीं किया गया है। सभी मूल ईसीएमएस्क्रिप्ट ऑब्जेक्ट्स को छोड़कर दिनांक वस्तुएं संकेतों की अनुपस्थिति को संभालती हैं जैसे कि संकेत संख्या दी गई थी; दिनांक वस्तुएं संकेत के अनुपस्थिति को संभालती हैं जैसे कि संकेत स्ट्रिंग दिया गया था। मेजबान वस्तुएं किसी अन्य तरीके से एक संकेत की अनुपस्थिति को संभाल सकती हैं।

नोट 2 चरण 7 लॉजिकल-ऑपरेशन के बजाय लॉजिकल-या ऑपरेशन का उपयोग करके संबंध ऑपरेटर (11.8.5) के तुलनात्मक तुलना एल्गोरिदम के चरण 3 से अलग है।

मेरा अनुमान है कि बिंदु 7 विभिन्न मूल्यांकन/रूपांतरण के माध्यम से किसी तरह के रूप में पहले वर्णित है, लेकिन मैं समझ नहीं क्या वास्तव में है happenning पहुँच गया था ...

किसी के लिए एक बहुत सरल स्पष्टीकरण प्रदान कर सकता हूँ था इस ?


मैं क्रम में थोड़ा बेहतर यह सब समझने के लिए क्यों जवाब देने की कोशिश करने को तैयार हूँ:

[] + {} -> [object Object] 
{} + [] -> 0 

उत्तर

7
  1. Let lprim ToPrimitive (lval) हो।
  2. rprim को अपराधी (रावल) होने दें।

कोई संकेत ToPrimitive प्रदान की जाती है के बाद से:

[[DefaultValue]] हे की आंतरिक विधि कोई संकेत के साथ कहा जाता है, तो यह व्यवहार करती संकेत के रूप में यदि संख्या में थे, जब तक ओ दिनांक ऑब्जेक्ट (15.9.6 देखें), इस मामले में यह व्यवहार करता है जैसे संकेत स्ट्रिंग था।

तो यह एक संख्या संकेत के साथ कॉल करने जैसा ही है:

When the [[DefaultValue]] internal method of O is called with hint Number, the following steps are taken: 
1. Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf". 
2. If IsCallable(valueOf) is true then, a. Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and an empty argument list. b. If val is a primitive value, return val. 
3. Let toString be the result of calling the [[Get]] internal method of object O with argument "toString". 
4. If IsCallable(toString) is true then, a. Let str be the result of calling the [[Call]] internal method of toString, with O as the this value and an empty argument list. b. If str is a primitive value, return str. 
5. Throw a TypeError exception. 

के बाद से [].valueOf() की वापसी मान नहीं एक आदिम है, यह [].toString() जो "" रिटर्न को जाता है।

यह एक ही वस्तु वस्तुओं के लिए लागू होता है, सिवाय एक वस्तु का .toString रिटर्न [object Object] जबकि एक सरणी के .toString रिटर्न .join(",")


{} + []

{} यहाँ एक वस्तु के रूप में इलाज नहीं है, लेकिन एक के रूप में खाली ब्लॉक तो कोड है कि चलाता है:

{} 
+[]; //Same as +[] (Number([])) which is 0 

अस्पष्टता को हल करने और {} + [] उपयोग से सामान्य परिणाम प्राप्त करने के लिए

({}) + [] या ({} + [])

अजीब कोड:

{} ! [] //false 
({}) ! [] //SyntaxError 
+0

अब और अधिक समझ बनाता है। विनिर्देश बहुत सुंदर हो सकता है लेकिन इसमें कुछ लीड मिल गईं। धन्यवाद। –

+0

@DidierGhys yep, ऑब्जेक्ट शाब्दिक के साथ सावधान, जावास्क्रिप्ट उन्हें जहां भी कर सकता है ब्लॉक के रूप में इलाज करने के लिए बहुत उत्सुक है। – Esailija

+0

मैं इसे ध्यान में रखूंगा। –

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