जावास्क्रिप्ट वर्ल्ड में जबरदस्ती है - एक जासूसी कहानी
नाथन, आपको पता नहीं है कि आपने क्या उजागर किया है।
मैं अब हफ्तों से इसकी जांच कर रहा हूं। यह सब पिछले अक्टूबर की तूफानी रात में शुरू हुआ। मैं गलती से Numberकक्षा में लड़खड़ा गया - मेरा मतलब है, दुनिया में जावास्क्रिप्ट जावास्क्रिप्ट क्यों थाNumber वर्ग क्यों है?
मैं इसके लिए तैयार नहीं था कि मैं आगे क्या पता लगाने जा रहा हूं।
यह पता चलता है कि जावास्क्रिप्ट, आपको बताए बिना, आपके नंबरों को वस्तुओं और आपकी वस्तुओं को आपकी नाक के नीचे नंबरों में बदल रहा है।
जावास्क्रिप्ट उम्मीद कर रहा था कि कोई भी पकड़ नहीं पाएगा, लेकिन लोग अजीब अप्रत्याशित व्यवहार की रिपोर्ट कर रहे हैं, और अब आपके और आपके प्रश्न के लिए मेरे पास सबूत हैं कि मुझे इस बात को व्यापक रूप से खोलने की जरूरत है।
यह वही है जो हमने अब तक पाया है। मुझे नहीं पता कि क्या मुझे भी आपको यह बताना चाहिए - आप अपने जावास्क्रिप्ट को बंद करना चाह सकते हैं।
> function dis() { return this }
undefined
जब आपने वह फ़ंक्शन बनाया, तो आपको शायद पता नहीं था कि आगे क्या होने वाला है। सब कुछ ठीक लग रहा था, और सब कुछ ठीक था - अभी के लिए।
कोई त्रुटि संदेश, बस कंसोल आउटपुट में "अपरिभाषित" शब्द, वास्तव में आप क्या उम्मीद करेंगे। आखिरकार, यह एक फ़ंक्शन घोषणा थी - इसे कुछ भी वापस करने के लिए नहीं माना जाता है।
लेकिन यह सिर्फ शुरुआत थी। आगे क्या हुआ, कोई भी भविष्यवाणी नहीं कर सकता था।
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
हाँ, मुझे पता है, तुम एक की उम्मीद है 5, लेकिन वह नहीं है जो आपको मिला, वह था - आपको कुछ और मिला - कुछ अलग।
मेरे साथ भी ठीक वैसा ही हुआ था।
मुझे नहीं पता था कि इसका क्या बनाना है। इसने मुझे पागल कर दिया। मैं सो नहीं सका, मैं नहीं खा सकता था, मैंने इसे पीने की कोशिश की, लेकिन माउंटेन ड्यू की कोई भी मात्रा मुझे भूल नहीं पाएगी। यह सिर्फ कोई मतलब नहीं था!
जब मुझे पता चला कि वास्तव में क्या चल रहा था - यह जबरदस्ती थी, और यह मेरी आंखों के सामने वहीं हो रहा था, लेकिन मैं इसे देखने के लिए बहुत अंधा था।
मोज़िला ने इसे डालकर दफनाने की कोशिश की जहां उन्हें पता था कि कोई भी नहीं देखेगा - उनके दस्तावेज ।
पुन: पढ़ने और फिर से पढ़ने और फिर से पढ़ने के घंटों के बाद मुझे यह मिला:
"... और आदिम मूल्य वस्तुओं में परिवर्तित हो जाएंगे।"
यह वहीं था जैसा कि ओपन सेन्स फॉन्ट में लिखा जा सकता है। यह call()समारोह था - मैं इतना मूर्ख कैसे हो सकता है ?!
मेरा नंबर अब एक नंबर नहीं था। जिस क्षण मैंने इसे पारित किया call(), यह कुछ और हो गया। यह बन गया ... एक वस्तु।
मैं यह पहली बार में विश्वास नहीं कर सकता। यह सच कैसे हो सकता है? लेकिन मैं उन सबूतों को नजरअंदाज नहीं कर सकता जो मेरे आसपास बढ़ रहे थे। यह ठीक है अगर तुम सिर्फ देखो:
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
wtfसही था। संख्याओं में कस्टम गुण नहीं हो सकते हैं - हम सभी जानते हैं कि! यह पहली बात है कि वे आपको अकादमी में पढ़ाते हैं।
हमें उस क्षण को पता होना चाहिए जब हमने कंसोल आउटपुट को देखा - यह वह संख्या नहीं थी जो हमने सोचा था कि यह था। यह एक आवेग था - एक वस्तु जो हमारी प्यारी निर्दोष संख्या के रूप में खुद को गुजार रही है।
यह था ... new Number(5)।
बेशक! यह सही समझ में आया। call()एक काम करना था, उसे एक समारोह में शामिल होना था, और यह करने के लिए कि उसे आबाद करने की आवश्यकता है this, वह जानता था कि वह ऐसा नहीं कर सकता है - उसे एक वस्तु की आवश्यकता थी और वह इसे प्राप्त करने के लिए कुछ भी करने को तैयार था, यहां तक कि अगर इसका मतलब हमारे नंबर के साथ ज़बरदस्ती करना है। जब call()नंबर देखा 5, वह एक अवसर देखा।
यह एकदम सही योजना थी: तब तक प्रतीक्षा करें जब तक कोई नहीं देख रहा था और हमारे नंबर को एक वस्तु के लिए स्वैप कर रहा था जो इसे जैसा दिखता है। हम एक नंबर प्राप्त करते हैं, फ़ंक्शन को आमंत्रित किया जाता है, और कोई भी समझदार नहीं होगा।
यह वास्तव में सही योजना थी, लेकिन सभी योजनाओं की तरह, यहां तक कि पूर्ण वाले भी, इसमें एक छेद था, और हम इसे सही तरीके से गिराने वाले थे।
देखिए, जो call()समझ में नहीं आया वह यह था कि वह शहर में एकमात्र ऐसा व्यक्ति नहीं था, जो संख्याओं में सामंजस्य स्थापित कर सकता था। यह सब के बाद जावास्क्रिप्ट था - हर जगह जबरदस्ती थी।
call() मेरा नंबर लिया, और मैं तब तक रुकने वाला नहीं था जब तक कि मैं उसके छोटे से नकाब से नकाब हटाकर उसे पूरे स्टैक ओवरफ्लो समुदाय में उजागर नहीं कर देता।
पर कैसे? मुझे एक योजना की जरूरत थी। यकीन है कि यह एक संख्या की तरह दिखता है, लेकिन मुझे पता है कि यह नहीं है, यह साबित करने का एक तरीका होगा। बस! यह संख्या की तरह दिखता है , लेकिन क्या यह एक जैसा काम कर सकता है?
मैंने बताया कि fiveमुझे उससे 5 गुना बड़ा बनने की जरूरत है - उसने पूछा क्यों नहीं और मैंने समझाया नहीं। मैंने तब कोई भी अच्छा प्रोग्रामर किया था: मैंने कई गुना किया। निश्चित रूप से ऐसा कोई तरीका नहीं था जिससे वह अपना रास्ता नकली कर सके।
> five * 5
25
> five.wtf
'potato'
लानत है! इतना ही नहीं अभी भी fiveसिर्फ ठीक wtfथा। लानत है इस लड़के और उसके आलू से।
आखिर क्या चल रहा था? क्या मैं इस पूरी बात के बारे में गलत था? क्या fiveवास्तव में एक संख्या है? नहीं, मुझे कुछ याद आ रहा है, मैं इसे जानता हूं, कुछ ऐसा है जिसे मैं भूल रहा हूं, कुछ इतना सरल और बुनियादी है कि मैं इसे पूरी तरह से देख रहा हूं।
यह अच्छा नहीं लग रहा था, मैं यह जवाब घंटों से लिख रहा था और मैं अभी भी अपनी बात बनाने के करीब नहीं था। मैं इसे जारी नहीं रख सका, अंततः लोग पढ़ना बंद कर देंगे, मुझे कुछ सोचना था और मुझे इसके बारे में तेजी से सोचना था।
रुको कि यह है! five25, 25 परिणाम नहीं था, 25 एक पूरी तरह से अलग संख्या थी। बेशक, मैं कैसे भूल सकता था? नंबर अपरिवर्तनीय हैं। जब आप गुणा करते हैं तो आपको 5 * 5कुछ भी नहीं सौंपा जाता है जिससे आप एक नया नंबर बनाते हैं 25।
यही होना चाहिए। किसी तरह जब मैं गुणा करता हूं five * 5, तो fiveसंख्या में तालमेल होना चाहिए और उस संख्या को गुणन के लिए उपयोग किया जाना चाहिए। यह उस गुणन का परिणाम है जो कंसोल पर मुद्रित होता है, fiveस्वयं के मूल्य पर नहीं । fiveकभी भी कुछ भी नहीं सौंपा जाता है - इसलिए निश्चित रूप से यह नहीं बदलता है।
तो फिर मैं अपने आप fiveको एक ऑपरेशन का परिणाम कैसे दे सकता हूं । मैं समझ गया। इससे पहले fiveकि सोचने का मौका मिले, मैंने "++" चिल्लाया।
> five++
5
अहा! मैं उसके पास था! हर कोई जानता 5 + 1है 6, यह एक सबूत था जो मुझे उजागर करने की आवश्यकता fiveथी जो एक संख्या नहीं थी! यह एक पाखण्डी था! एक बुरा नपुंसक जो गिनती करना नहीं जानता था। और मैं इसे साबित कर सकता था। यहां बताया गया है कि वास्तविक संख्या कैसे कार्य करती है:
> num = 5
5
> num++
5
रुको? यहां पर क्या हो रहा था? उच्छ्वास में मैं इतना फंस गया fiveकि मैं भूल गया कि पोस्ट ऑपरेटर कैसे काम करते हैं। जब मैं का उपयोग ++अंत में की fiveमैं वापसी कह रहा हूँ वर्तमान मान, तो बढ़ा देते five। ऑपरेशन से पहले वह मूल्य होता है जो कंसोल पर प्रिंट हो जाता है। numवास्तव में था 6और मैं इसे साबित कर सकता था:
>num
6
यह देखने का समय कि fiveवास्तव में क्या था:
>five
6
... यह वही था जो होना चाहिए। fiveअच्छा था - लेकिन मैं बेहतर था। अगर fiveअभी भी एक वस्तु थी, जिसका मतलब होगा कि इसके पास अभी भी संपत्ति होगी wtfऔर मैं वह सब कुछ शर्त लगाने को तैयार था जो यह नहीं करता था।
> five.wtf
undefined
अहा! मैं सही था। मैं उसके पास था! fiveअब एक संख्या थी - यह अब कोई वस्तु नहीं थी। मुझे पता था कि गुणा चाल इस बार इसे नहीं बचाएगी। देखें five++वास्तव में है five = five + 1। गुणा के विपरीत, ++ऑपरेटर एक मान प्रदान करता है five। अधिक विशेष रूप से, यह उसे परिणाम प्रदान करता है five + 1जैसे कि गुणन के मामले में एक नया अपरिवर्तनीय संख्या देता है ।
मुझे पता था कि मैं उसके पास था, और सिर्फ यह सुनिश्चित करने के लिए कि वह उसके रास्ते से हट नहीं सकता था। मैं अपनी आस्तीन ऊपर एक और परीक्षण किया था। अगर मैं सही था, और fiveअब वास्तव में एक नंबर था, तो यह काम नहीं करेगा:
> five.wtf = 'potato?'
'potato?'
वह इस बार मुझे बेवकूफ बनाने वाला नहीं था। मुझे पता potato?था कि कंसोल पर प्रिंट होना है क्योंकि यह असाइनमेंट का आउटपुट है। असली सवाल यह wtfहै कि क्या अब भी रहेगा?
> five.wtf
undefined
बस के रूप में मुझे संदेह है - कुछ भी नहीं - क्योंकि संख्या को गुण नहीं सौंपा जा सकता है। हमने सीखा कि अकादमी में पहले वर्ष;)
धन्यवाद नाथन। इस प्रश्न को पूछने में आपके साहस की बदौलत मैं अंत में यह सब मेरे पीछे रख सकता हूं और एक नए मामले की ओर बढ़ सकता हूं।
इस समारोह के बारे में एक तरह toValue()। हे भगवान। Nooo!
++अंतर्निहित प्रकार को प्रभावित करने के लिए लगता है