2011-11-23 23 views
8

मैं एक काम कर रहे जावास्क्रिप्ट कोड में आया हूं जिसे मैं समझा नहीं सकता। उदाहरण के लिए:~ [] निर्माण जावास्क्रिप्ट में कैसे काम करता है?

  • +[]===0
  • -[]===0
  • ~[]===-1
  • ~-~[]===-2
  • ~-~-~-~-~[]===-5
  • ~-~-~-~-~[]+~[]===-6
  • ~+~[]===0
  • ~+~+~[]===-1
  • ~+~+~+~[]===0

आप इन भाव के तर्क की व्याख्या कर सकते?

+2

मुझे लगता है कि अगर मैं कुछ कोड में आया तो मैं डेस्क को फ्लिप कर दूंगा। –

+1

उत्तर है: '+ [NaN] == !!!! 0 && + [{}] + ~~ [[]] - []' – jAndy

+1

यदि मैंने देखा कि किसी भी कोडबेस में मैं मूल डेवलपर को फिर से लिखने के लिए कहूंगा यह। यह बहुत बुरा अभ्यास है !!! –

उत्तर

11

[] एक खाली सरणी वस्तु है, इसलिए:

+ []: सकारात्मक पूर्णांक, उर्फ ​​0 है, जो करने के लिए === है होना करने के लिए खाली सरणी मजबूर 0
- []: होना करने के लिए मजबूर खाली सरणी ऋणात्मक पूर्णांक, उर्फ ​​0, जो === से 0
~ []: bitwise खाली सरणी नहीं है, जो -1 का मूल्यांकन करता है, जो === से -1
~ - ~ []: बिटवाई अस्वीकृत नहीं है नोटेड खाली सरणी: ~-(-1) -> ~1 -> -2

आदि ...

+1

होना चाहिए: अंतिम स्ट्रिंग – Denis

+0

पर '~ 1 -> -2' धन्यवाद, उत्तर को ठीक किया गया। –

+0

-1 '+ []: सकारात्मक पूर्णांक होने के लिए खाली सरणी बल दें, उर्फ ​​0, जो === से 0' है, यह समझाता नहीं है कि ऐसा क्यों होता है। यह सिर्फ परिणाम को बहाल करता है। जाहिर है अगर '+ [] === 0', तो' + [] 'को' 0' में परिवर्तित कर दिया जाना चाहिए। सवाल तर्क की व्याख्या करने के लिए पूछता है। – RightSaidFred

2

जब आप + या - ऑपरेटर का उपयोग किसी भी चीज़ पर करते हैं, तो यह Number पर कॉल करता है। Number([])0 देता है, तो आपको अपना पहला दो जवाब मिलते हैं।

~ ऑपरेटर bitwise नहीं है। असल में यह किसी संख्या में सभी बिट्स को उलट देता है, जो 0 से -1 बदलता है। Bitwise ऑपरेटरों पर अधिक here

शेष बाकी मामलों के संयोजन हैं। आप जो कुछ भी चाहते हैं उसे बनाने के लिए आप उन चीज़ों को बहुत अधिक जोड़ सकते हैं।

+0

समझ गया। मुझे '[] 'से' 0' भाग का कास्टिंग याद आया। – Denis

0

मेरा मानना ​​है कि अगर मैं गलत हूं, तो मुझे सही करें, लेकिन एक सरणी में जोड़ना (जैसे, किसी सरणी में मान जोड़ने के बजाय सरणी में मान जोड़ना) इसे किसी संख्या में रखता है। शेष केवल मूल + का उपयोग कर रहे हैं, - ऑपरेटर (टिल्ड (~) थोड़ा सा नहीं है) संख्या को संशोधित करने के लिए और फिर एक समीकरण।

So [] == array ([]); 
[] + 1 == number (0); 
+[]===0 (true) 
+0

वास्तव में यह इसे एक स्ट्रिंग पर डाला गया, संख्या नहीं। '[1] + 1 =" 11 "' तो '+ [] = 0' क्योंकि यह '+" "' जैसा है – pleasedontbelong

1

मैं अपने सर्वश्रेष्ठ प्रयास करेंगे:

[]===0 पाठ्यक्रम झूठी की है, क्योंकि [] वास्तव में 0. हालांकि के बराबर नहीं है, []==0 सच है क्योंकि एक अंतर्निहित डाली मौजूद है।

+ और -[] काम क्योंकि प्लस या माइनस [] को वास्तविक संख्या में रखता है।

~0 (बिटवाइड 0 के विपरीत) -1 है। इस प्रकार ~[]===-1 काम करता है।

अन्य लोग केवल 1 गुना घटाकर या जोड़कर काम करते हैं।

2

प्रश्न में केवल परिणाम को पुन: स्थापित करने के बजाय, मैं का विवरण देने का प्रयास करूंगा क्यों आपको वह परिणाम मिलता है।

स्पष्टीकरण

केवल पहला उदाहरण ले रहा है (बाकी कुछ इसी तरह करना होगा क्योंकि), हम विनिर्देश देखने के लिए कि क्या होता है का पालन कर सकते हैं।

11.4.6 Unary + Operator से, हम देख सकते हैं कि ToNumber रूपांतरण होता है।

वापसी करने के लिए संख्या (GetValue (expr))।

9.3 ToNumber से हम देखते हैं कि अगर एक वस्तु (अपने सरणी की तरह) को देखते हुए एक ToPrimitive रूपांतरण ToNumber पर एक और प्रयास के बाद जगह लेता है।

वस्तु

निम्न चरणों को लागू करें:

  1. primValue ToPrimitive (इनपुट तर्क, संकेत संख्या) बनें।
  2. वापसी करने के लिए संख्या (PrimValue)।
9.1 To Primitive से

, अगर ToPrimitive एक वस्तु हो जाता है, हम देख सकते हैं कि अपनी [[DefaultValue]] लाई गई है:

वस्तु

वापसी वस्तु लिए एक डिफ़ॉल्ट मान। किसी ऑब्जेक्ट का डिफ़ॉल्ट मान ऑब्जेक्ट की [[DefaultValue]] आंतरिक विधि को कॉल करके पुनर्प्राप्त किया जाता है, वैकल्पिक संकेत PreferredType को पारित करता है। [[DefaultValue]] आंतरिक विधि का व्यवहार सभी मूल ECMAScript ऑब्जेक्ट्स के लिए 8.12.8 में इस विनिर्देशन द्वारा परिभाषित किया गया है।

8.12.8 [[DefaultValue]] (hint) से

, क्या अंत में क्या होगा होगा कि toString() सरणी पर बुलाया जाएगा, और लौट आए। ऊपर वर्णित अनुसार यह स्ट्रिंग रिकर्सिव ToNumber पर भेजी जाती है।

तो क्या होता है जब ToNumber रूपांतरण स्ट्रिंग पर किया जाता है? वैसे यह 9.3.1 ToNumber Applied to the String Type में वर्णित है, और थोड़ा लंबा है। , क्या स्ट्रिंग कर हम अपने सरणी से वापस पाने के

Number("");  // result is 0 on an empty string 
Number(" "); // result is 0 on a string with only whitespace 
Number("123"); // result is 123 on a numeric string 
Number(" 123 ");// result is 123 on a numeric string with leading & trailing spaces 
Number("abc"); // result is NaN (not a number) on non-numeric strings 

तो सवाल यह है: सरल बस सीधे रूपांतरण करते हैं, और देखो क्या होता है। फिर, यह परीक्षण करने में आसान है।

[].toString(); // result is "" (empty string) 

के बाद से परिणाम एक खाली स्ट्रिंग है, और एक खाली स्ट्रिंग के एक ToNumber रूपांतरण 0 के रूप में ऊपर दिखाए गए, मतलब यह होगा कि हम 0 === 0 की तुलना कर रहे है।

यह वही मानो हमने किया होगा:

Number([].toString()) === 0; // true 

या यह एक थोड़ा और अधिक बाहर आकर्षित करने के लिए:

var x = []; 
x = x.toString(); // "" 
x = Number(x); // 0 
x === 0; // true 

अधिक toString का परिणाम है।

सरणी के अधिक toString रूपांतरण दिखाने के लिए, निम्नलिखित पर विचार:

[1].toString();   // "1" 
[1,2,3].toString();  // "1,2,3" 
["a",1,"b",2].toString(); // "a,1,b,2" 

तो ऊपर सरणी पर एक ToNumber रूपांतरण करने के लिए, पहले हमें एक नंबर देना होगा, और पिछले दो में परिणाम होगा NaN

Number([1]);   // 1 
Number([1,2,3]);  // NaN 
Number(["a",1,"b",2]); // NaN 

कुछ सबूत

और सबूत है कि इस toString() रूपांतरण ToNumber रूपांतरण से पहले होता है प्रदान करने के लिए, हम वास्तव में Array.prototype.toString संशोधित भिन्न परिणाम प्रदान करने के लिए कर सकते हैं, और किसी भी ToNumber रूपांतरण का उपयोग करेगा कि संशोधित परिणाम

Array.prototype.toString = function() { 
    var n = 0; 
    for(var i = 0; i < this.length; i++) { 
     n += this[i]; 
    } 
    return n; 
}; 

यहाँ मैं एक समारोह है कि सरणी का योग के साथ Array.prototype पर toString से बदल दिया है। जाहिर है आप यह नहीं करना चाहते हैं, लेकिन हम दिखा सकते हैं कि अब हम एक अलग परिणाम कैसे प्राप्त करेंगे।

Number([1,2,3]); // 6 
+[1,2,3];   // 6 

तो अब आप कि हमारे सरणी की ToNumber रूपांतरण है कि पहले NaN में हुई है | अब सरणी में आइटम का कुल योग में जिसके परिणामस्वरूप है देख सकते हैं।

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