জাভাস্ক্রিপ্ট ওয়ার্ল্ডে কোর্সিওন রয়েছে - একটি গোয়েন্দা গল্প
নাথান, আপনি কী উদঘাটিত করেছেন তা আপনার কোনও ধারণা নেই।
আমি এখন কয়েক সপ্তাহ ধরে এটি তদন্ত করছি। এটি সব গত অক্টোবরের ঝড়ের রাতে শুরু হয়েছিল। আমি দুর্ঘটনাক্রমে Numberক্লাসে হোঁচট খেয়েছি - মানে পৃথিবীতে জাভাস্ক্রিপ্টের Numberক্লাস কেন হয়েছিল ?
আমি পরবর্তীটি যা সন্ধান করতে যাচ্ছিলাম তার জন্য আমি প্রস্তুত ছিলাম না।
দেখা যাচ্ছে যে জাভাস্ক্রিপ্ট আপনাকে না বলেই আপনার নম্বরের অবজেক্টে এবং আপনার অবজেক্টগুলিকে আপনার নাকের নীচে সংখ্যায় পরিবর্তন করে চলেছে।
জাভাস্ক্রিপ্ট আশা করেছিল যে কেউ এটিকে ধরবে না, তবে লোকেরা অদ্ভুত অপ্রত্যাশিত আচরণের খবর দিচ্ছে, এবং এখন আপনাকে এবং আপনার প্রশ্নের জন্য আমার কাছে প্রমাণ রয়েছে যে আমার এই জিনিসটি পুরোপুরি উন্মুক্ত করার দরকার আছে।
এটি আমরা এখনও অবধি খুঁজে পেয়েছি। আমি জানিনা আমার এমনকি এটি আপনাকে বলা উচিত কিনা - আপনি নিজের জাভাস্ক্রিপ্ট বন্ধ করতে চাইতে পারেন।
> function dis() { return this }
undefined
আপনি যখন এই ফাংশনটি তৈরি করেছিলেন, সম্ভবত আপনার পরবর্তী ধারণাটি ছিল না no সবকিছু ঠিকঠাক দেখাচ্ছে, এবং সবকিছু ঠিক আছে - আপাতত।
কোনও ত্রুটি বার্তা নেই, কনসোল আউটপুটে কেবল "অপরিজ্ঞাত" শব্দটি নয়, ঠিক আপনি কী আশা করবেন। সর্বোপরি, এটি একটি ফাংশন ঘোষণা ছিল - এটি কোনও কিছুই ফেরানোর কথা নয়।
তবে এটি ছিল কেবল শুরু। এরপরে কী ঘটেছিল, কেউই ভবিষ্যদ্বাণী করতে পারত না।
> 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গুনের ক্ষেত্রে একটি নতুন অপরিবর্তনীয় সংখ্যা দেয় ।
আমি জানতাম যে আমি তাকে পেয়েছি এবং কেবল এটি নিশ্চিত করতে যে সে এখান থেকে বেরিয়ে আসার পথটি দুর্বল করতে পারে না। আমার আস্তিনে আরও একটি পরীক্ষা ছিল had আমি যদি ঠিকই থাকি, এবং fiveএখনই যদি সত্যিই একটি সংখ্যা হত, তবে এটি কাজ করবে না:
> five.wtf = 'potato?'
'potato?'
সে এবার আমাকে বোকা বানাবে না। আমি জানতাম potato?কনসোলে মুদ্রিত হতে যাচ্ছিল কারণ এটি অ্যাসাইনমেন্টের আউটপুট। আসল প্রশ্ন, wtfএখনও থাকবে?
> five.wtf
undefined
যেমন আমি সন্দেহ করেছি - কিছুই নয় - কারণ সংখ্যার বৈশিষ্ট্য নির্ধারিত হতে পারে না। আমরা শিখেছি যে একাডেমিতে প্রথম বছর;)
ধন্যবাদ নাথান এই প্রশ্ন জিজ্ঞাসা করার আপনার সাহসের জন্য আমি অবশেষে এই সব আমার পিছনে রাখতে এবং একটি নতুন মামলায় যেতে পারি বলে ধন্যবাদ।
ফাংশন সম্পর্কে এই এক পছন্দ করুন toValue()। ওহ আল্লাহ. Nooo!
++