এই সংখ্যায় কী ঘটছে সংখ্যার অবজেক্টের বৈশিষ্ট্য রয়েছে এবং সংখ্যা বাড়িয়েছে?


246

সাম্প্রতিক একটি টুইটটিতে জাভাস্ক্রিপ্টের এই স্নিপেট রয়েছে।

কেউ দয়া করে ধাপে ধাপে এর মধ্যে কী ঘটছে তা ব্যাখ্যা করতে পারেন?

> function dis() { return this }
undefined
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
> five * 5
25
> five.wtf
"potato"
> five++
5
> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined
> five
6

বিশেষত, এটি আমার কাছে পরিষ্কার নয়:

  • কেন ফল dis.call(5)একটি হল Numberএকটি কিছু সঙ্গে [[PrimitiveValue]]সম্পত্তি, কিন্তু ফলাফল five++এবং five * 5শুধু সাধারণ সংখ্যার বলে মনে 5এবং 25(না Numberগুলি)
  • কেন five.wtfসম্পত্তি five++বৃদ্ধির পরে অদৃশ্য হয়ে যায়
  • স্পষ্টতই মূল্য নির্ধারণের দায়িত্ব সত্ত্বেও কেন five.wtfসম্পত্তি আর বর্ধনের পরেও স্থায়ী হয় না।five++five.wtf = 'potato?'

6
হাহাহা দেখলাম সেই টুইট !! এটি এত উদ্ভট, আমি মনে করি কারণ আপনি এটির সংখ্যাবৃদ্ধি করেছেন, এটি ++
কোনওভাবে

8
আপনি কোন লাইন বুঝতে পারেন না? Preবনাম Postবৃদ্ধি? গুণনের পরে, এটি আবার এমন একটি Numberবস্তুর যা wtfসম্পত্তি নেই ... তবে তারপরেও এটি objectএটি থাকতে পারে properties..
রায়ন

25
আপনি কল যখন disসঙ্গে dis.call(5), এই আদিম সংখ্যা গোপন 5প্রকারের একটি বস্তু মধ্যে Numberযে রয়েছে 5, যাতে এই অবজেক্ট হিসেবে ফিরে যেতে পারে thisঅবজেক্ট। ++ধর্মান্তরিত এটি একটি আদিম সংখ্যা বৈশিষ্ট্য থাকতে পারে না ফিরে, তাই wtfঅনির্ধারিত হতে শুরু করে।
জিএসার্গ


5
@ রেয়ন ... এবং এটি ES6 এর সাথে পরিবর্তিত হয়েছে । সুতরাং এই পুরো জিনিস এগিয়ে যাওয়া ঘটতে বন্ধ হবে।
জিসার্গ

উত্তর:


278

ওপি এখানে। স্ট্যাক ওভারফ্লোতে এটি দেখতে মজাদার :)

আচরণের মাধ্যমে পদক্ষেপ নেওয়ার আগে কয়েকটি বিষয় পরিষ্কার করা গুরুত্বপূর্ণ:

  1. সংখ্যা মান এবং সংখ্যা অবজেক্ট ( a = 3বনাম a = new Number(3)) খুব আলাদা। একটি আদিম, অন্যটি একটি বস্তু। আপনি আদিমগুলিতে অ্যাট্রিবিউট বরাদ্দ করতে পারবেন না তবে আপনি বস্তুগুলিতে করতে পারেন।

  2. দুজনের মধ্যে জবরদস্তি নিহিত।

    উদাহরণ স্বরূপ:

    (new Number(3) === 3)  // returns false
    (new Number(3) == 3)   // returns true, as the '==' operator coerces
    (+new Number(3) === 3) // returns true, as the '+' operator coerces
  3. প্রতিটি এক্সপ্রেশন একটি ফিরতি মান আছে। যখন REPL একটি এক্সপ্রেশন পড়ে এবং কার্যকর করে, এটি এটি প্রদর্শন করে। প্রত্যাবর্তনের মানগুলি প্রায়শই এর অর্থ বোঝায় না যে আপনি কী ভাবেন এবং এমন জিনিসগুলি বোঝান যা কেবল সত্য নয়।

ঠিক আছে, আমরা এখানে যাই

জাভাস্ক্রিপ্ট কোডের মূল চিত্র

অঙ্গীকার.

> function dis() { return this }
undefined
> five = dis.call(5)
[Number: 5]

একটি ফাংশন নির্ধারণ disএবং কল সঙ্গে এটি 5। এটি 5প্রসঙ্গ ( this) হিসাবে ফাংশনটি সম্পাদন করবে । এখানে এটি একটি সংখ্যা মান থেকে একটি সংখ্যা অবজেক্টে জোর করা হয়। এটি লক্ষ করা খুব গুরুত্বপূর্ণ যে আমরা কঠোর মোডে থাকলে এটি ঘটত না

> five.wtf = 'potato'
'potato'
> five.wtf
'potato'

এখন আমরা অ্যাট্রিবিউট সেট five.wtfকরতে 'potato', এবং পাঁচ একটি অবজেক্ট হিসেবে সঙ্গে, নিশ্চিত করুন যথেষ্ট এটিকে স্বীকার করলে সিম্পল অ্যাসাইনমেন্ট

> five * 5
25
> five.wtf
'potato'

সঙ্গে fiveএকটি অবজেক্ট হিসেবে, আমি এটা এখনও সহজ গাণিতিক অপারেশন সম্পাদন করতে পারবেন নিশ্চিত। এটা হতে পারে. এর বৈশিষ্ট্যগুলি কি এখনও আটকে আছে? হ্যাঁ.

পালা।

> five++
5
> five.wtf
undefined

এখন আমরা চেক five++পোস্টফিক্স ইনক্রিমেন্টের কৌশলটি হ'ল পুরো এক্সপ্রেশনটি মূল মানের বিপরীতে মূল্যায়ন করবে এবং তারপরে মান বৃদ্ধি করবে। দেখে মনে fiveহচ্ছে এখনও পাঁচটি, তবে সত্যই প্রকাশটি পাঁচটির জন্য মূল্যায়ন করা হয়েছে, তারপরে সেট fiveহয়েছে 6

কেবল fiveসেট করা হয়নি 6, তবে এটি আবার একটি সংখ্যা মান হিসাবে জোর করা হয়েছিল, এবং সমস্ত বৈশিষ্ট্য হারিয়ে গেছে। যেহেতু আদিম গুণাবলী ধরে রাখতে পারে না, five.wtfতাই সংজ্ঞায়িত।

> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined

আমি আবার একটি বৈশিষ্ট্য reassign করার প্রচেষ্টা wtfকরার five। প্রত্যাবর্তনের মানটি এটি লাঠি বোঝায় তবে এটি আসলে কোনও fiveসংখ্যার মান নয়, কোনও সংখ্যার অবজেক্ট নয়। অভিব্যক্তিটি মূল্যায়ন করে 'potato?'তবে আমরা যখন পরীক্ষা করে দেখি যে এটি নির্ধারিত হয়নি।

সম্মান.

> five
6

পোস্টফিক্স ইনক্রিমেন্টের পর fiveথেকে 6


70
আপনি কি নিবিড়ভাবে দেখছেন?
ওয়েডলস

3
@ নাথান লং ওয়েল, জাভাতে, যা জাভাস্ক্রিপ্ট শুরু থেকেই প্রচুর ilyণ নিয়েছিল, সমস্ত আদিম শ্রেণীর সমতুল্য। intএবং Integer, উদাহরণস্বরূপ। আমি ধরে নিলাম এটি তাই আপনি একটি ফাংশন তৈরি করতে পারেন doSomething(Object), এবং এখনও এটি আদিম দিতে সক্ষম হবেন। এক্ষেত্রে প্রিমেটিভরা তাদের সংশ্লিষ্ট ক্লাসে রূপান্তরিত হবে। তবে জেএস প্রকৃতপক্ষে প্রকারের বিষয়ে চিন্তা করে না, সুতরাং কারণ সম্ভবত অন্যরকম
সাপেন

4
@ এরিক প্রথম জিনিসটি ++হল ToNumber টির মান প্রয়োগ করা । একই স্ট্রিংয়ের সাথে স্ট্রিংয়ের সাথে তুলনা করুন: যদি আপনার থাকে x="5", তবে x++নম্বরটি ফেরত দিন 5
অ্যাপসিলাররা

2
সত্যিই যাদু সমস্ত ঘটবে dis.call(5), জোর করে আপত্তি জানাতে, আমি কখনই এটি আশা করতাম না।
mcfedr

3
@gman ব্যতীত আরও অনেক বিস্তৃত প্রভাব রয়েছে যার মধ্যে এর স্ট্যান্ডার্ড লাইব্রেরির বড় অংশগুলির নামকরণ, স্ট্যান্ডার্ড অবজেক্টের ধরণের আচরণ এবং এমনকি এটি একটি ব্রেস-ও-সেমিকোলনস সিনট্যাক্স ব্যবহার করে এমনকি (সেমিকোলনগুলি হলেও alচ্ছিক) এটি জাভা প্রোগ্রামারদের সাথে পরিচিত হওয়ার জন্য তৈরি করা হয়েছিল। হ্যাঁ, এটি শুরুর দিকে বিভ্রান্তিকর। এর অর্থ এই নয় যে প্রভাবগুলির অস্তিত্ব নেই।
জুলে

77

কোনও সংখ্যাকে উপস্থাপনের দুটি ভিন্ন উপায় রয়েছে:

var a = 5;
var b = new Number(5);

প্রথমটি আদিম, দ্বিতীয়টি কোনও বস্তু। সমস্ত উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য উভয়ই একই আচরণ করে, ব্যতীত কনসোলে মুদ্রিত হওয়ার সময় তারা আলাদা দেখায়। একটি গুরুত্বপূর্ণ পার্থক্য হ'ল, একটি বস্তু হিসাবে, new Number(5)নতুন কোনও সম্পত্তি যেমন কোনও সমতল হিসাবে গ্রহণ করে {}, যখন আদিম 5না করে:

a.foo = 'bar';  // doesn't stick
b.foo = 'bar';  // sticks

প্রাথমিক dis.call(5)অংশ হিসাবে , দয়া করে দেখুন "এই" কীওয়ার্ডটি কীভাবে কাজ করে? । আসুন শুধু বলতে যে প্রথম যুক্তি callমান হিসেবে ব্যবহার করা হয় this, এবং যে এই অপারেশন বাহিনী আরো জটিল মধ্যে সংখ্যা Numberবস্তুটি কি দুই রূপেই। * পরে ++বাহিনীকে অনেক আদিম ফর্ম ফিরে, কারণ ছাড়াও অপারেশন +একটি নতুন ফলাফল আদিম।

> five = dis.call(5)  // for all intents and purposes same as new Number(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"

একটি Numberবস্তু নতুন বৈশিষ্ট্য গ্রহণ করে।

> five++

++একটি নতুন আদিম 6মান ফলাফল ...

> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined

... যা কাস্টম বৈশিষ্ট্যগুলি ধারণ করে না এবং গ্রহণ করে না।

* দ্রষ্টব্য যে কঠোর মোডেthis যুক্তি ভিন্নভাবে চিকিত্সা করা হবে এবং হবে না একটি রূপান্তরিত করা Number। বাস্তবায়নের বিশদগুলির জন্য http://es5.github.io/#x10.4.3 দেখুন ।


2
@ ফারাপ নিশ্চিতভাবে সি / সি ++ এ আরও ভাল উপায় যেখানে আপনি করতে পারেন #define true false। বা জাভাতে, যেখানে আপনি সংখ্যার অর্থ কী তা কেবল নতুন করে সংজ্ঞা দিতে পারেন। এগুলি ভাল শক্ত ভাষা। সত্য কথা বলতে গেলে, প্রতিটি ভাষারই একই রকম "কৌশল" থাকে যেখানে আপনি ফলাফল পান যা ইচ্ছাকৃত হিসাবে কাজ করে তবে অদ্ভুত লাগতে পারে।
VLAZ

1
@ ওয়েল্ড ওকে আমাকে পুনরায় প্রতিবেদন দাও, এই কারণেই আমি হাঁসের টাইপিংকে ঘৃণা করি।
ফারাপ

59

জাভাস্ক্রিপ্ট ওয়ার্ল্ডে কোর্সিওন রয়েছে - একটি গোয়েন্দা গল্প

নাথান, আপনি কী উদঘাটিত করেছেন তা আপনার কোনও ধারণা নেই।

আমি এখন কয়েক সপ্তাহ ধরে এটি তদন্ত করছি। এটি সব গত অক্টোবরের ঝড়ের রাতে শুরু হয়েছিল। আমি দুর্ঘটনাক্রমে 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!


9
ভুলে যাও জ্যাক; এটি জাভাস্ক্রিপ্ট।
শেঠ

কেন আমরা জেএসে কনস্ট্রাক্টর ফাংশনগুলিকে "ক্লাস" বলি?
বিবর্তনবক্স

27
01 > function dis() { return this }
02 undefined
03 > five = dis.call(5)
04 Number {[[PrimitiveValue]]: 5}
05 > five.wtf = 'potato'
06 "potato"
07 > five.wtf
08 "potato"
09 > five * 5
10 25
11 > five.wtf
12 "potato"
13 > five++
14 5
15 > five.wtf
16 undefined
17 > five.wtf = 'potato?'
18 "potato?"
19 > five.wtf
20 undefined
21 > five
22 6

01একটি ফাংশন ঘোষণা করে disযা প্রসঙ্গের অবজেক্টটিকে ফেরত দেয়। আপনি thisকঠোর মোড ব্যবহার করছেন কিনা তা নির্ভর করে কি পরিবর্তনগুলি প্রতিনিধিত্ব করে। ফাংশনটি হিসাবে ঘোষিত হলে পুরো উদাহরণটির বিভিন্ন ফলাফল রয়েছে:

> function dis() { "use strict"; return this }

এটি ES5 নির্দিষ্টকরণের 10.4.3 বিভাগে বিশদ is

  1. যদি ফাংশন কোডটি কঠোর কোড হয় তবে এটিটিকে এইআরজিতে সেট করুন।
  2. অন্যথায় যদি এইআর্গটি নাল বা অপরিজ্ঞাত হয় তবে এটি বিশ্বব্যাপী অবজেক্টে এই বাইন্ডিংটি সেট করুন।
  3. অন্যথায় যদি প্রকার (thisArg) অবজেক্ট না হয় তবে এই বাইন্ডিংটিকে টোঅবজেক্টে (thisArg) সেট করুন।

02ফাংশন ঘোষণার রিটার্ন মান। undefinedএখানে স্ব-বর্ণনামূলক হওয়া উচিত।

03ভেরিয়েবলটি আদিম মানের প্রসঙ্গে ডাকলে fiveতার রিটার্ন মান দিয়ে শুরু করা disহয় 5। কারণ disকঠোর মোডে নয়, এই লাইনটি কল করার অনুরূপ five = Object(5)

04বিজোড় Number {[[PrimitiveValue]]: 5}রিটার্ন মানটি সেই বস্তুর প্রতিনিধিত্ব যা আদিম মানটি মোড় করে5

05fiveবস্তুর wtfসম্পত্তির স্ট্রিং মান নির্ধারিত হয়'potato'

06 অ্যাসাইনমেন্টের রিটার্ন মান এবং এটি স্ব-বর্ণনামূলক হওয়া উচিত।

07fiveবস্তুর wtfসম্পত্তি পরীক্ষা করা হচ্ছে

08যেমন five.wtfআগে থেকেই সেট করা হয়েছিল 'potato'এটা ফেরৎ 'potato'এখানে

09fiveবস্তুর আদিম মান দ্বারা গুন করা হচ্ছে 5। এটি অন্য কোনও বস্তুর গুণক হওয়ার চেয়ে আলাদা নয় এবং ES5 স্পেসিফিকেশনের ১১.৫ ধারায় ব্যাখ্যা করা হয়েছে । বিশেষ দ্রষ্টব্য হ'ল কীভাবে বস্তুগুলি সংখ্যাসূচক মানগুলিতে কাস্ট করা হয় যা কয়েকটি বিভাগে আচ্ছাদিত।

9.3 টু নাম্বার :

  1. প্রাইমভ্যালুকে টোপ্রিমিটাইভ হতে দিন (ইনপুট আর্গুমেন্ট, ইঙ্গিত নম্বর)।
  2. ToNumber (primValue) ফিরুন।

9.1 ToPrimitive :

অবজেক্টের জন্য একটি ডিফল্ট মান ফিরিয়ে দিন। Objectচ্ছিক ইঙ্গিত PreferredType পাস করে কোনও অবজেক্টের ডিফল্ট মানটি [[DefaultValue]] অবজেক্টের অভ্যন্তরীণ পদ্ধতিতে কল করে পুনরুদ্ধার করা হয়। এর আচরণের জন্য সমস্ত নেটিভ নাম ECMAScript বস্তু [[DefaultValue]] অভ্যন্তরীণ পদ্ধতি এই স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত করা হয় 8.12.8

৮.১২.৮ [[ডিফল্ট মূল্য]] :

আসুন "[মানুন]] অবজেক্ট ও এর অভ্যন্তরীণ পদ্ধতিটিকে" ভ্যালুআফ "যুক্ত করে কল করার ফলাফল হিসাবে মান হওয়া যাক।

  1. যদি ইসক্লেলেবল (ভ্যালুওফ) সত্য হয় তবে,

    1. ওকে এই মান হিসাবে এবং খালি আর্গুমেন্টের তালিকা হিসাবে মান হিসাবে [[কল]] মান হিসাবে অভ্যন্তরীণ পদ্ধতি কল করার ফলাফল হতে পারে Let
    2. যদি মানটি একটি আদিম মান হয় তবে ফিরে ভাল করুন।

এটি বলার সমস্ত রাউন্ড আউট উপায় যে অবজেক্টটির valueOfফাংশনটি কল হয়ে যায় এবং সেই ফাংশন থেকে ফেরতের মান সমীকরণে ব্যবহৃত হয়। আপনি যদি valueOfফাংশনটি পরিবর্তন করতে চান তবে আপনি অপারেশনের ফলাফলগুলি পরিবর্তন করতে পারেন:

> five.valueOf = function () { return 10 }
undefined
> five * 5
50

10যেমন fiveগুলি valueOfফাংশন অপরিবর্তিত ছিল, সেটা আবৃত আদিম মান 5যাতে five * 5মূল্যায়ণ করতে 5 * 5যা ফলাফল25

11যখন fiveঅবজেক্ট করা হয়েছিল তখন থেকে অপরিবর্তিত থাকার পরেও বস্তুর wtfসম্পত্তি পুনরায় মূল্যায়ন করা হয়05

12 'potato'

13postfix বর্ধিত অপারেটর উপর বলা হয় five, যা সাংখ্যিক মান পায় ( 5, আমরা আবৃত কিভাবে তার আগে), দোকানে মূল্য যাতে এটি ফিরে যেতে পারে, যোগ করে 1মান (থেকে 6), মান নির্ধারণ five, এবং আয় সঞ্চিত মান ( 5)

14 আগের মতো, প্রত্যাশিত মানটি বর্ধিত হওয়ার আগেই মান

15wtfআদিম মান (সম্পত্তির 6) পরিবর্তনশীল সঞ্চিত fiveঅ্যাক্সেস করা হয়। ES5 স্পেসিফিকেশনের 15.7.5 ধারাটি এই আচরণটি সংজ্ঞায়িত করে। নম্বর থেকে সম্পত্তি পেতে Number.prototype

16 Number.prototypeএকটি নেই wtfসম্পত্তি, তাই undefinedফিরিয়ে দেওয়া হয়

17 five.wtfএকটি মান নির্ধারিত হয় 'potato?'এসাইনমেন্টটি ES5 নির্দিষ্টকরণের 11.13.1 এ সংজ্ঞায়িত করা হয়েছে । মূলত নির্ধারিত মানটি ফেরত আসে তবে সঞ্চয় হয় না।

18 'potato?' এসাইনমেন্ট অপারেটর দ্বারা ফিরিয়ে দেওয়া হয়েছিল

19আবার five, যার একটি মান 6অ্যাক্সেস করা হয় এবং আবার Number.prototypeকোনও wtfসম্পত্তি থাকে না

20 undefined উপরে বর্ণিত হিসাবে

21 five অ্যাক্সেস করা হয়

22 6 বর্ণিত হিসাবে ফিরে আসে 13


17

এটা বেশ সহজ।

function dis () { return this; }

এটি thisপ্রসঙ্গে ফিরে আসে । সুতরাং, আপনি যদি করেন তবে আপনি call(5)একটি বস্তু হিসাবে নম্বরটি পাস করছেন।

callফাংশন আর্গুমেন্ট সরবরাহ করে না, প্রথম যুক্তি দিতে প্রেক্ষাপটে হয় this। সাধারণত যদি আপনি এটি করতে চান তে এটি প্রসঙ্গের উপর, আপনি এটা দিতে {}তাই dis.call({}), যার মানে thisফাংশন একটি খালি this। যাইহোক, আপনি পাস 5করলে মনে হয় এটি কোনও বস্তুতে রূপান্তরিত হবে। দেখুন। কল

সুতরাং ফিরতি হয় object

আপনি যখন করেন five * 5, জাভাস্ক্রিপ্ট বস্তুটিকে fiveআদিম প্রকার হিসাবে দেখে , তাই সমান 5 * 5। মজার বিষয় হল, করুন '5' * 5, এটি এখনও সমান 25, তাই জাভাস্ক্রিপ্ট স্পষ্টভাবে হুডের নিচে কাস্টিং হচ্ছে। অন্তর্নিহিত fiveধরণের কোনও পরিবর্তন এই লাইনে করা হয় না

তবে আপনি যখন ++এটি করবেন তখন বস্তুটি আদিম numberধরণের রূপান্তরিত করবে এইভাবে .wtfসম্পত্তি সরিয়ে ফেলবে । কারণ আপনি অন্তর্নিহিত ধরণের উপর প্রভাব ফেলছেন


প্রত্যাবর্তন নম্বর
GSerg

++রূপান্তর করে এবং এটিকে পুনরায় নির্ধারণ করে। ++সমান variable = variable + 1। সুতরাং আপনি আলগাwtf
রাজেশ

*বনাম ++সব আমার গুলান না। কোনও ফাংশন থাকা যা কোনও যুক্তি এবং প্রত্যাশার প্রত্যাশা করে না this, সেই ফাংশনটি যেভাবেই হোক একটি যুক্তি গ্রহণ করে এবং এমন কিছু দেয় যা পছন্দসই, কিন্তু যুক্তিটি নয় - যা আমার কাছে কোনও ধারণা রাখে না।
নাথান লং

কী dis.call()করে তা দেখানোর জন্য এটি @ নাথানলং আপডেট করেছেন ।
কলিয়াম লিনিংটন

5++ সি ভাষার মতোই আচরণ করে তাই অবাক হওয়ার কিছু নেই। thisআদিম প্রকারগুলি স্পষ্টভাবে রূপান্তরিত হয় তাই কেবল কোনও বস্তুর পয়েন্টার। কোনও যুক্তিযুক্ত কোনও ফাংশনে কেন অন্তত একটি প্রসঙ্গ থাকতে পারে না? 1 ম যুক্তি callবা bindপ্রসঙ্গের সেট করতে ব্যবহৃত হয়। এছাড়াও, ফাংশনগুলি ক্লোজার যা যার অর্থ তাদের কেবল অ্যাক্সেসের চেয়ে বেশি রয়েছেarguments
রিভনফল

10

আদিম মানগুলির সম্পত্তি থাকতে পারে না। আপনি যখন আদিম মানের উপর কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করেন, তখন এটি স্বচ্ছভাবে একটি অস্থায়ী সংখ্যা অবজেক্টে ট্রান্সটাইপ করে।

তাই:

> function dis() { return this }
undefined
// Like five.dis(), so dis return the temporaty Number object and 
// reference it in five
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}

// Write the wtf attribut on the Number object referenced by five
> five.wtf = 'potato'
"potato"
// Read the wtf attribut on the Number object referenced by five
> five.wtf
"potato"

// Return 5*5 but dont change the reference of five
> five * 5
25
// Read the same wtf attribut on the Number object referenced by five
> five.wtf
"potato"

// Change the five reference to a new primitive value (5+1). Five
// reference a primitive now.
> five++
5

// Read the wtf attribut on a new temporary Number object construct from
// the primitive referenced by five. So wtf does not exist.
> five.wtf
undefined

// Write the wtf attribut on a new temporary Number object construct from
// the primitive referenced by five. But this object not referenced by
// five. It will be lost.
> five.wtf = 'potato?'
"potato?"

// Read the wtf attribut on a new temporary Number object construct from
// the primitive referenced by five. So wtf does not exist.
> five.wtf
undefined
> five
6

8

ফাংশন ঘোষণা করুন dis। ফাংশন তার প্রসঙ্গে ফিরে আসে

function dis() { return this }
undefined

disপ্রসঙ্গে কল করুন 5। কঠোর মোডে ( MDN ) প্রসঙ্গ হিসাবে পাস করার পরে আদিম মানগুলি বাক্স করা হয় । সুতরাং fiveএখন অবজেক্ট (বক্স নম্বর)।

five = dis.call(5)
Number {[[PrimitiveValue]]: 5}

ভেরিয়েবলের wtfউপর সম্পত্তি ঘোষণা করুনfive

five.wtf = 'potato'
"potato"

মান five.wtf

five.wtf
"potato"

fiveবাক্সযুক্ত 5, সুতরাং এটি একই সময়ে সংখ্যা এবং অবজেক্ট (5 * 5 = 25)। এটি পরিবর্তন হয় না five

five * 5
25

মান five.wtf

five.wtf
"potato"

fiveএখানে আনবক্সিং করছি। fiveএখন শুধু আদিম number। এটি মুদ্রণ করে 5এবং তারপরে যুক্ত 1করে five

five++
5

fiveএখন আদিম সংখ্যা 6, এটিতে কোনও বৈশিষ্ট্য নেই।

five.wtf
undefined

আদিমদের বৈশিষ্ট্য থাকতে পারে না, আপনি এটি সেট করতে পারবেন না

five.wtf = 'potato?'
"potato?"

আপনি এটি পড়তে পারবেন না, কারণ এটি সেট করা হয়নি

five.wtf
undefined

fiveহয় 6কারণ পোস্টে উপরে বৃদ্ধিশীল এর

five
6

7

প্রথমে দেখে মনে হচ্ছে এটি নোডেজ কনসোল দিয়ে চলছে।

1।

    function dis() { return this }

ফাংশন ডিস তৈরি করে (), তবে এটি হিসাবে সেট varকরা হয়নি বলে ফেরত দেওয়ার কোনও মূল্য ছিল না undefinedতবে আউটপুটটি dis()সংজ্ঞায়িত হলেও ছিল। সাইডনোটে, thisফাংশনটি সম্পাদন হয়নি বলে ফিরিয়ে দেওয়া হয়নি।

2।

    five = dis.call(5)

এই আয় জাভাস্ক্রিপ্ট এর Numberঅবজেক্ট কারণ আপনি শুধু ফাংশন সেট dis()এর thisমান আদিম থেকে পাঁচ।

3।

   five.wtf = 'potato'

প্রথম আয় "potato"কারণ আপনি শুধু বৈশিষ্ট্য নির্ধারণের wtfএর fiveজন্য 'potato'। জাভাস্ক্রিপ্ট একটি পরিবর্তনশীল সেট এর মান, শৃঙ্খল একাধিক ভেরিয়েবল তা সহজ করে এবং সেগুলিকে এই মত একই মানে সেট: a = b = c = 2

4।

    five * 5

এই আয় 25কারণ আপনি শুধু আদিম সংখ্যা গুন 5করতে five। এর মানটি বস্তুর fiveমান দ্বারা নির্ধারিত হয়েছিল Number

5।

    five.wtf

আমি এই লাইনটি আগে এড়িয়ে গেছি কারণ আমি এখানে এটি পুনরাবৃত্তি করব। এটি কেবলমাত্র wtfউপরে যে বৈশিষ্ট্যের সেট করেছে তার মান প্রদান করে ।

6।

    five++

@ কলাম যেমন বলেছে, ততক্ষণটিকে বস্তু থেকে একই মান থেকে ++রূপান্তর করবে ।numberNumber {[[PrimitiveValue]]: 5}}

এখন যেহেতু fiveএকটি number, আপনি যতক্ষণ না এই ধরণের কিছু না করেন ততক্ষণ আপনি এগুলিতে আর সম্পত্তি সেট করতে পারবেন না:

    five = dis.call(five)
    five.wtf = "potato?"

অথবা

    five = { value: 6, wtf: "potato?" }

এছাড়াও মনে রাখবেন যে দ্বিতীয় পদ্ধতিতে প্রথম পদ্ধতিটি ব্যবহার করার চেয়ে আলাদা আচরণ থাকবে কারণ এটি Numberআগে তৈরি হওয়া বস্তুর পরিবর্তে জেনেরিক বস্তুর সংজ্ঞা দিচ্ছে ।

আমি আশা করি এটি সাহায্য করে, জাভাস্ক্রিপ্ট জিনিসগুলি ধরে নিতে পছন্দ করে, তাই Numberবস্তু থেকে আদিম হিসাবে পরিবর্তিত হয়ে বিভ্রান্তি পেতে পারে number। আপনি typeofকীওয়ার্ডটি ব্যবহার করে কী কী টাইপ তা পরীক্ষা করতে পারেন , আপনি ফিরে আসার পরে পাঁচটি টাইপ লিখে 'object'এবং এটি করার পরে আপনি five++ফিরে আসেন 'number'

@ ডিজিজ সংখ্যা অবজেক্ট এবং আদিম সংখ্যাগুলির মধ্যে পার্থক্যটি খুব ভালভাবে বর্ণনা করে।


6

জাভাস্ক্রিপ্ট স্কোপগুলি এক্সিকিউশন কনটেক্সট দিয়ে তৈরি। প্রতিটি এক্সিকিউশন কনটেক্সট একটি লেক্সিকাল এনভায়রনমেন্ট (বহিরাগত / বিশ্বব্যাপী স্কোপযুক্ত মান), একটি পরিবর্তনশীল পরিবেশ (স্থানীয়ভাবে স্কোপযুক্ত মান) এবং একটি এই বাধ্যবাধকতা রয়েছে

এই বাঁধাই কার্য সম্পাদনের প্রসঙ্গ খুব গুরুত্বপূর্ণ অংশ। এই বাঁধাইয়েরcall পরিবর্তন করার একটি উপায় হ'ল ব্যবহার করা , এবং এটি করার ফলে বাইন্ডিংটি স্বয়ংক্রিয়ভাবে তৈরি করার জন্য একটি বস্তু তৈরি হবে।

ফাংশন.প্রোটোটাইপ.কল () (এমডিএন থেকে)

বাক্য গঠন
fun.call(thisArg[, arg1[, arg2[, ...]]])

thisArg মজাদার কলটির জন্য
এর মান সরবরাহ করে। নোট করুন যে এটি পদ্ধতি দ্বারা দেখা প্রকৃত মান হতে পারে না: যদি পদ্ধতিটি অ-কঠোর মোড কোডে একটি ফাংশন হয় তবে নাল এবং অপরিজ্ঞাতটি বিশ্বব্যাপী অবজেক্টের সাথে প্রতিস্থাপন করা হবে এবং আদিম মানগুলি বস্তুতে রূপান্তরিত হবে । (জোর আমার)

একবার এটি স্পষ্ট হয়ে যায় যে 5 টি রূপান্তরিত হচ্ছে new Number(5), বাকিগুলি বরং সুস্পষ্ট হওয়া উচিত। নোট করুন যে অন্যান্য উদাহরণগুলিও এতো দীর্ঘ সময় ধরে কাজ করবে যতক্ষণ না সেগুলি আদিম মান।

function primitiveToObject(prim){
  return dis.call(prim);
}
function dis(){ return this; }

//existing example
console.log(primitiveToObject(5));

//Infinity
console.log(primitiveToObject(1/0));

//bool
console.log(primitiveToObject(1>0));

//string
console.log(primitiveToObject("hello world"));
<img src="http://i.stack.imgur.com/MUyRV.png" />

এখানে চিত্র বর্ণনা লিখুন


4

কয়েকটা ধারণাই ব্যাখ্যা করে যা ঘটেছিল

5 একটি সংখ্যা, একটি আদিম মান

Number {[[PrimitiveValue]]: 5} সংখ্যার একটি উদাহরণ (আসুন এটি অবজেক্ট র‌্যাপার বলি)

যখনই আপনি একটি আদিম মূল্যের ওপর একটি সম্পত্তি / পদ্ধতি অ্যাক্সেস করতে, জাতীয় ইঞ্জিন একটি বস্তু (উপযুক্ত ধরনের মোড়কের তৈরি করবে Numberজন্য 5, Stringজন্য 'str'এবং Booleanজন্য true) এবং যে বস্তুর মোড়কের উপর সম্পত্তি এক্সেস / পদ্ধতি কল সমাধান। true.toString()উদাহরণস্বরূপ আপনি যখন এটি করেন তা ঘটে ।

বস্তুগুলিতে ক্রিয়াকলাপ সম্পাদনের সময়, সেই ক্রিয়াকলাপগুলি সমাধান করার জন্য এগুলি আদিম মানগুলিতে রূপান্তরিত হয় (ব্যবহার করে toStringবা valueOf) - উদাহরণস্বরূপ যখন

var obj = { a : 1 };
var string = 'mystr' + obj;
var number = 3 + obj;

stringএর স্ট্রিং সংযুক্তকরণের রাখা হবে mystrএবং obj.toString()এবং numberযোগে রাখা হবে 3এবং obj.valueOf()

এখন সব একসাথে রাখা

five = dis.call(5)

dis.call(5)আসলে পদ্ধতি (5).dis()থাকলে ঠিক 5তেমন আচরণ করে dis। পদ্ধতি কলটি সমাধান করার জন্য, অবজেক্টের মোড়ক তৈরি করা হয় এবং তার উপর মেথড কলটি সমাধান করা হয়। এই মুহুর্তে আদিম মান 5 এর চারপাশে একটি বস্তুর মোড়কে পাঁচটি পয়েন্ট।

five.wtf = 'potato'

কোনও জিনিসে সম্পত্তি সেট করা, এখানে অভিনব কিছু নেই।

five * 5

এটি আসলে five.valueOf() * 5বস্তুর মোড়কের কাছ থেকে আদিম মান অর্জন করছে। fiveএখনও প্রাথমিক অবজেক্টের দিকে নির্দেশ করে।

five++

এটা আসলে five = five.valueOf() + 1এই রেখাটি five5 টির মান অবজেক্টের মোড়কে ধরে রাখার আগে , যখন এই বিন্দুটির পরে fiveআদিম মান ধরে6

five.wtf
five.wtf = 'potato?'
five.wtf

fiveএখন আর কোনও বস্তু নয়। এই লাইনগুলির প্রত্যেকটি .wtfসম্পত্তি অ্যাক্সেস সমাধান করার জন্য একটি নতুন সংখ্যা তৈরি করে । উদাহরণগুলি স্বতন্ত্র, সুতরাং একটিতে সম্পত্তি সেট করা অন্যটিতে দৃশ্যমান হবে না। কোডটি এইটির সাথে সম্পূর্ণ সমান:

(new Number(6)).wtf;
(new Number(6)).wtf = 'potato?';
(new Number(6)).wtf;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.