javascript কেন++[[]][+[]]+[+[]] স্ট্রিংটি "10" ফেরত দেয়?




syntax (7)

+ [] মূল্যায়ন 0 [...] তারপর সংক্ষেপে (+ অপারেশন) এটি অ্যারের সামগ্রীটিকে তার স্ট্রিং প্রতিনিধিত্বের সাথে রূপান্তরিত করে যার মধ্যে রয়েছে কমা দিয়ে যোগ করা উপাদানগুলি।

অ্যারে সূচী গ্রহণের মত অন্য কিছু (+ অপারেশন তুলনায় grater অগ্রাধিকার আছে) আদর্শ এবং আকর্ষণীয় কিছু নয়।

এটি বৈধ এবং জাভাস্ক্রিপ্টে স্ট্রিংটি "10" করে ( এখানে আরও উদাহরণ ):

console.log(++[[]][+[]]+[+[]])

কেন? এখানে কি হচ্ছে?


যদি আমরা এটি বিভক্ত করি, জগাখিচুড়ি সমান হয়:

++[[]][+[]]
+
[+[]]

জাভাস্ক্রিপ্টে, এটা সত্য যে +[] === 0+ কিছু সংখ্যায় রূপান্তরিত করে, এবং এই ক্ষেত্রে এটি +"" বা 0 +"" নেমে আসবে (নীচের স্পেসিফিকেশন বিস্তারিত দেখুন)।

অতএব, আমরা এটি সহজ করতে পারি ( ++ এর উপর পূর্বশর্ত আছে):

++[[]][0]
+
[0]

কারণ [[]][0] মানে: [[]] element [[]] থেকে প্রথম উপাদানটি পান, এটি সত্য যে:

  • [[]][0] অভ্যন্তরীণ অ্যারে ( [] ) প্রদান করে। রেফারেন্সের কারণে এটি [[]][0] === [] বলতে ভুল, তবে ভুল নোট এড়াতে অভ্যন্তরীণ অ্যারেকে কল করুন।
  • ++[[]][0] == A + 1 , ++ মানে হল 'একের দ্বারা বৃদ্ধি'।
  • ++[[]][0] === +(A + 1) ; অন্য কথায়, এটি সর্বদা একটি সংখ্যা হবে ( +1 অগত্যা একটি সংখ্যা ফেরত দেয় না, ++ সর্বদা থাকে - এই নির্দেশের জন্য টিম ডাউনকে ধন্যবাদ)।

আবার, আমরা আরো সুস্পষ্ট কিছু মধ্যে জগাখিচুড়ি সহজ করতে পারেন। আসুন বিকল্প [] জন্য A :

+([] + 1)
+
[0]

জাভাস্ক্রিপ্টে, এটিও সত্য: [] + 1 === "1" , কারণ [] == "" (একটি খালি অ্যারে যোগদান), তাই:

  • +([] + 1) === +("" + 1) , এবং
  • +("" + 1) === +("1") , এবং
  • +("1") === 1

আসুন এটি আরও সহজ করা যাক:

1
+
[0]

এছাড়াও, জাভাস্ক্রিপ্টে এটি সত্য: [0] == "0" , কারণ এটি একটি উপাদান সহ একটি অ্যারে যোগদান করছে। যোগদান , দ্বারা পৃথক উপাদান সংহত করা হবে। এক উপাদান দিয়ে, আপনি এই যুক্তিটি প্রথম উপাদান নিজেই পরিণতি হবে যে অনুমান করতে পারেন।

সুতরাং, শেষে আমরা (সংখ্যা + স্ট্রিং = স্ট্রিং) প্রাপ্ত:

1
+
"0"

=== "10" // Yay!

স্পেসিফিকেশন বিস্তারিত +[] :

এটি বেশ একটি মেজাজ, কিন্তু করতে +[] , প্রথমে এটি একটি স্ট্রিং রূপান্তরিত করা হচ্ছে কারণ এটি কি + বলেছেন:

11.4.6 ইউনিরী + অপারেটর

Unary + অপারেটর তার অপার্যান্ডটিকে নম্বরের রূপে রূপান্তরিত করে।

উত্পাদন UnaryExpression: + UnaryExpression নিম্নরূপ মূল্যায়ন করা হয়:

  1. ExaryExpression মূল্যায়নের ফলাফল EXP হতে দিন।

  2. Return toNumber (GetValue (expr))।

ToNumber() বলেছেন:

উদ্দেশ্য

নিম্নলিখিত পদক্ষেপ প্রয়োগ করুন:

  1. PrimValue ToPrimitive হতে দিন (ইনপুট যুক্তি, ইঙ্গিত স্ট্রিং)।

  2. রিটার্ন ToString (PrimValue)।

ToPrimitive() বলেছেন:

উদ্দেশ্য

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

[[DefaultValue]] বলেছেন:

8.12.8 [[ডিফল্ট ভ্যালু]] (ইঙ্গিত)

যখন [[ডিফল্টভালিউ]] O এর অভ্যন্তরীণ পদ্ধতিটি হান্ট স্ট্রিংয়ের সাথে বলা হয়, নিম্নলিখিত ধাপগুলি নেওয়া হয়:

  1. ToString কে "[স্ট্রিং]" যুক্তি সহ [[Get]] অভ্যন্তরীণ পদ্ধতিতে কল করার ফলাফল হতে দিন।

  2. যদি IsCallable (toString) সত্য হয় তবে,

ক। স্ট্রিংটি [[কল]] স্ট্রিং এর অভ্যন্তরীণ পদ্ধতিতে কল করার ফলাফলটি হ'ল O এবং এটি একটি খালি যুক্তি তালিকা হিসাবে।

খ। Str যদি একটি আদিম মান, str strat।

একটি অ্যারের .toString বলছেন:

15.4.4.2 Array.prototype.toString ()

যখন ToString পদ্ধতি বলা হয়, নিম্নলিখিত পদক্ষেপ নেওয়া হয়:

  1. অ্যারে এই মান ToObject কলিং ফলাফল হতে দিন।

  2. Func "argue" সহ [[Get]] অভ্যন্তরীণ পদ্ধতিতে কল করার ফলাফল হতে দিন।

  3. যদি IsCallable (func) মিথ্যা হয়, তাহলে func কে আদর্শ অন্তর্নির্মিত পদ্ধতি হতে হবে Object.prototype.toString (15.2.4.2)।

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

তাই +[] নিচে আসে +"" , কারণ [].join() === ""

আবার, + হিসাবে সংজ্ঞায়িত করা হয়:

11.4.6 ইউনিরী + অপারেটর

Unary + অপারেটর তার অপার্যান্ডটিকে নম্বরের রূপে রূপান্তরিত করে।

উত্পাদন UnaryExpression: + UnaryExpression নিম্নরূপ মূল্যায়ন করা হয়:

  1. ExaryExpression মূল্যায়নের ফলাফল EXP হতে দিন।

  2. Return toNumber (GetValue (expr))।

ToNumber জন্য "" হিসাবে সংজ্ঞায়িত করা হয়েছে:

StringNumericLiteral এর MV ::: [খালি] 0 হয়।

তাই +"" === 0 , এবং এইভাবে +[] === 0


সংখ্যার ব্যবধানে "10" এ একটি অভিব্যক্তি মূল্যায়ন করার সর্বনিম্ন সম্ভাব্য উপায়গুলি হল:

+!+[] + [+[]] // "10"

-~[] + [+[]] // "10"

// ========== ব্যাখ্যা ========== \\

+!+[] : +[] !0 রূপান্তর !0 রূপান্তর true+true রূপান্তর 1. -~[] = -(-1) যা 1

[+[]] : +[] রূপান্তর 0 [0] একটি একক উপাদান 0 সঙ্গে একটি অ্যারে।

তারপর JS 1 + [0] মূল্যায়ন করে, এভাবে Number + Array এক্সপ্রেশন। তারপর ECMA স্পেসিফিকেশন কাজ করে: + অপারেটর মূল Object প্রোটোটাইপ থেকে toString()/valueOf() ফাংশন কল করে উভয় toString()/valueOf() স্ট্রিংয়ে রূপান্তরিত করে। একটি অভিব্যক্তি উভয় অপারেটিং শুধুমাত্র সংখ্যা যদি এটি একটি additive ফাংশন হিসাবে কাজ করে। কৌতুক সহজেই অ্যারে একটি উপাদান সংযুক্ত স্ট্রিং উপস্থাপনা মধ্যে তাদের উপাদান রূপান্তর।

কিছু উদাহরণ:

1 + {} //    "1[object Object]"
1 + [] //    "1"
1 + new Date() //    "1Wed Jun 19 2013 12:13:25 GMT+0400 (Caucasus Standard Time)"

NaN দুটি Objects সংযোজন ফলাফলের একটি চমৎকার ব্যতিক্রম রয়েছে:

[] + []   //    ""
[1] + [2] //    "12"
{} + {}   //    NaN
{a:1} + {b:2}     //    NaN
[1, {}] + [2, {}] //    "1,[object Object]2,[object Object]"

এর সহজ করা যাক:

++[[]][+[]]+[+[]] = "10"

var a = [[]][+[]];
var b = [+[]];

// so a == [] and b == [0]

++a;

// then a == 1 and b is still that array [0]
// when you sum the var a and an array, it will sum b as a string just like that:

1 + "0" = "10"

  1. ইউনিনারি প্লাস দেওয়া স্ট্রিং সংখ্যা রূপান্তর
  2. বৃদ্ধি অপারেটর স্ট্রিং রূপান্তর এবং 1 দ্বারা বৃদ্ধি
  3. [] == ''। খালি স্ট্রিং
  4. + '' বা + [] মূল্যায়ন 0।

    ++[[]][+[]]+[+[]] = 10 
    ++[''][0] + [0] : First part is gives zeroth element of the array which is empty string 
    1+0 
    10

এই এক মূল্যায়ন কিন্তু একটি বিট ছোট

+!![]+''+(+[])
  • [] - একটি অ্যারে রূপান্তরিত হয় যা আপনি এতে যোগ বা বিয়োগ করলে 0 তে রূপান্তরিত হয়, তাই + +] = 0
  • ! [] - মিথ্যা মূল্যায়ন, তাই তাই !! [] সত্য মূল্যায়ন
  • + !! [] - সত্যকে মূল্যায়ন করে এমন একটি সাংখ্যিক মানতে সত্য রূপান্তর করে, তাই এই ক্ষেত্রে 1
  • + '' - স্ট্রিং রূপে সংখ্যার রূপান্তরিত হওয়ার ফলে এক্সপ্রেশনটিতে একটি খালি স্ট্রিং যোগ করে
  • + [] - 0 মূল্যায়ন

তাই মূল্যায়ন করা হয়

+(true) + '' + (0)
1 + '' + 0
"10"

তাই এখন আপনি পেয়েছেন, এটি চেষ্টা করুন:

_=$=+[],++_+''+$

++[[]][+[]] => 1 // [+[]] = [0], ++0 = 1
[+[]] => [0]

তারপর আমরা একটি স্ট্রিং concatenation আছে

1+[0].toString() = 10






syntax