2016-10-20 5 views
28

एक दिलचस्प बात जो मैंने पहले कभी नहीं देखी है उसे किसी अन्य प्रश्न में पोस्ट किया गया था।जावास्क्रिप्ट `+ + i` के रूप में क्या व्याख्या करता है?

var i = + +1; 

उन्होंने सोचा कि अतिरिक्त + एक स्ट्रिंग के लिए इसे परिवर्तित, लेकिन वे केवल एक स्ट्रिंग है जो यह कन्वर्ट करने के लिए की वजह से करने के लिए जोड़ रहे थे: वे की तरह कुछ था।

हालांकि, यह मुझे प्रश्न पर ले जाता है: यहां क्या चल रहा है?

मैं वास्तव में एक संकलक त्रुटि होने की उम्मीद करता था, लेकिन जावास्क्रिप्ट (कम से कम क्रोम में) इसके साथ ठीक है ... यह मूल रूप से कुछ भी नहीं करता है। Demo

var i = 5; 
 
var j = + +i; 
 
document.body.innerHTML = i === j ? 'Same' : 'Different';

किसी को भी पता है कि वास्तव में होने वाली है और क्या जावास्क्रिप्ट इस प्रक्रिया के साथ क्या कर रहा है:

मैं प्रदर्शित करने के लिए एक छोटे से JSFiddle बनाया?

एक

मैं शायद सोचा था कि यह ++i है जैसे कि यह इलाज होगा, लेकिन i को बढ़ा नहीं है, और आप इसे एक मूल्य (जैसे, + +5) है, जो आप के साथ ऐसा नहीं कर सकते के साथ भी कर सकते हैं ++ (जैसे, ++5 है संदर्भ त्रुटि)।

स्पेसिंग भी इसे प्रभावित नहीं करता है (उदाहरण के लिए, + + 1 और + +1 समान हैं)।

मेरा सबसे अच्छा अनुमान यह है कि यह अनिवार्य रूप से उन्हें सकारात्मक/नकारात्मक संकेतों के रूप में व्यवहार कर रहा है और उन्हें एक साथ रख रहा है। यह 1 == - -1 और -1 == + -1 जैसा दिखता है, लेकिन यह इतना अजीब है।

क्या यह सिर्फ एक विचित्र व्यवहार है, या क्या इसे कहीं मानक में दस्तावेज किया गया है?

+1

यह मेरे लिए लग रहा है '+' ऑपरेटर की तरह के रूप में वैकल्पिक बाईं संकार्य व्यवहार करता है। यदि कोई बाएं ऑपरेंड नहीं है, तो यह सही ऑपरेंड लौटाता है। – Amy

+5

उनके बीच की जगह वाले '+' या '-' ऑपरेटर केवल सरल '+/-' ऑपरेटर हैं। आप '+ + 3' कर सकते हैं और यह आपको' 3' देगा। इसके बारे में कुछ भी अजीब नहीं है – galchen

+0

http://pythontutor.com/javascript.html#mode=edit –

उत्तर

32

AST Explorer के माध्यम से अपना कथन डालकर, हम देख सकते हैं कि हम यहां क्या प्राप्त करते हैं, यह दो घोंसला यूनरी अभिव्यक्ति, यूनरी + ऑपरेटर के साथ है।

यह एक एकल + और +i से मिलकर अभिव्यक्ति है, और +i अपने आप में एक एकल + और i से मिलकर अभिव्यक्ति है।

यूनरी + ऑपरेटर के साथ यूनरी अभिव्यक्ति, अभिव्यक्ति भाग को एक संख्या में परिवर्तित कर देगा। तो आप अनिवार्य रूप से i को किसी संख्या में परिवर्तित कर रहे हैं, फिर उसके परिणाम को एक संख्या में परिवर्तित कर रहे हैं, फिर से (जो नो-ऑप है)।

पूरा होने के लिए, यह के रूप में जोड़ने के रूप में कई स्तरों पर काम करता है:

var i = 5; 
console.log(+ + + + + +i); // 5 
console.log(i); // still 5 
+0

पर स्वचालित रूपांतरण है, स्पष्ट रूप से आप इन अनिश्चित काल तक श्रृंखलाबद्ध कर सकते हैं: '+ + + + + + + + 1' वैध जावास्क्रिप्ट है। – tadman

+0

वास्तव में आप कर सकते हैं, आपने मुझे मध्य-संपादन पकड़ा :) –

+8

तो यह जावास्क्रिप्ट का "भैंस भैंस भैंस भैंस" है। – Amy

1

+ ऑपरेटर एक संख्या में परिवर्तित हो जाते हैं, दो + ऑपरेटरों के बीच एक जगह के साथ अतिरिक्त कुछ भी नहीं करता है।

5

मेरे लिए यह बहुत स्पष्ट है,

var a = +3; 
var b = +a; // same as a, could be -a, for instance 
var c = + +a; // same as above, same as +(+a) 
4

जावास्क्रिप्ट दुभाषिया increment operator के रूप में यह देखता है आप ++variable करते हैं।

यदि आप + +variable करते हैं तो जावास्क्रिप्ट दुभाषिया इसे Unary plus के रूप में देखता है, मान को संख्या में दो बार जोड़ता है।

तो

var a = 1; 
var b = +a; 
var c = +b; 

console.log(c);// still 1 

रूप

var c = + +1; 

ही है तो सरल जवाब है कि दो धन चिह्न एक रिक्ति से अलग नहीं किया जा सकता है incrementation के रूप में व्याख्या की जानी है, अंतरिक्ष यह इतना आसान बनाता है दुभाषिया दो अलग-अलग रिक्त स्थान देखता है, जो वास्तव में

+1

अधिक स्पष्ट '+ (+ 1)' के बराबर भी – tadman

9

यह विनिर्देशन में है।

खोदने के माध्यम से, हम §14.6.2.2 से देख सकते हैं कि वृद्धि और कमी ऑपरेटर यूनरी ऑपरेटरों पर पहले (और पसंदीदा होना चाहिए) सूचीबद्ध हैं। तो अकेले प्राथमिकता यह समझाएगी नहीं।

the punctuation table in §11.7 को देखकर, हम देख सकते हैं कि ++ (ऑपरेटर) का प्रत्येक उदाहरण स्पेस में दोनों को एक साथ दिखाता है, बिना सफेद जगह के। यही कारण है, निर्णायक नहीं है जब तक आप की जाँच ...

The whitespace rules in §11.2, विशेष रूप से:

व्हाइट अंतरिक्ष कोड अंक एक StringLiteral, एक RegularExpressionLiteral, एक खाका है, या एक TemplateSubstitutionTail जहां वे महत्वपूर्ण कोड अंक माना जाता है के भीतर हो सकती है एक शाब्दिक मूल्य का हिस्सा बनाते हैं। वे एक टिप्पणी के भीतर भी हो सकते हैं, लेकिन किसी अन्य प्रकार के टोकन में दिखाई नहीं दे सकते हैं।

जेएस मनमाने ढंग से व्हाइटस्पेस मध्य-ऑपरेटर की अनुमति नहीं देता है।

PegJS और Esprima दोनों में जेएस सिंटैक्स, इसे दोहराएं, शाब्दिक दो-वर्ण स्ट्रिंग ++ पर मेल खाता है।

0

हालांकि यह बहुत समान दिख सकता है, + + और ++ एएसटी दुभाषिया के लिए एक ही चीज़ नहीं है। टोकन अलगाव पर भी लागू होता है: varfoovar foo जैसा नहीं है।

अभिव्यक्ति में + + +i, प्रत्येक x को विशिष्ट यूनरी ऑपरेटर के रूप में माना जाता है, जो आपके चर को केवल एक संख्या में परिवर्तित करता है। वृद्धिशीलता ऑपरेशन के लिए, जो ++ है, कोई रिक्त स्थान की अनुमति नहीं है, न तो + और परिवर्तनीय टोकन के बीच। नीचे दिए गए उदाहरण में, अंतिम पंक्ति मान्य नहीं है:

var x = "4"; 
 
console.log(+ + +x); 
 
console.log(+ + ++x); 
 
console.log(+ ++ +x);

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