যেহেতু @ মৌরিসিও মন্তব্য করেছেন (![]+[])[+[]]"চ" ("ভুয়া" এর প্রথম চর), (![]+[])[+!+[]])এটি "এ", ইত্যাদি ...
এটা কিভাবে কাজ করে?
আসুন প্রথম চরিত্রটি পরীক্ষা করি, 'চ':
(![]+[])[+[]]; // 'f'
এক্সপ্রেশন ![]+[]অপারেটরের প্রথম অপারেন্ডটি - প্রথম বন্ধনীর মধ্যে parent এক্সপ্রেশনটির প্রথম অংশটি রচনা করেছে ![]এবং এটি উত্পাদন করবে falseকারণ একটি অ্যারে অবজেক্ট - অন্য কোনও অবজেক্ট উদাহরণ হিসাবে সত্যবাদী , এবং লজিকাল (!) প্রয়োগ একরকম নয় অপারেটর, এটি মান উত্পাদন করে false, উদাহরণস্বরূপ।
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
এর পরে, আমাদের সংযোজনের দ্বিতীয় অপারেন্ড রয়েছে, একটি খালি অ্যারে, []এটি কেবল falseস্ট্রিংয়ে মান রূপান্তর করতে তৈরি করা হয়েছে, কারণ খালি অ্যারের স্ট্রিং প্রতিনিধিত্ব কেবল একটি খালি স্ট্রিং, সমান:
false+[]; // "false"
false+''; // "false"
শেষ অংশ, বন্ধনীগুলির পরে স্কোয়ার বন্ধনীগুলির জোড়া, তারা সম্পত্তি অ্যাক্সেসর এবং তারা একটি অভিব্যক্তি গ্রহণ করে, যা ইউনারি প্লাস অপারেটর দ্বারা আবার একটি খালি অ্যারে প্রয়োগ করে গঠিত হয়।
ইউনারি প্লাস অপারেটর যা করে তা হ'ল রূপান্তরকরণ টাইপ করুন Number, উদাহরণস্বরূপ:
typeof +"20"; // "number"
আরও একবার, এটি একটি খালি অ্যারে প্রয়োগ করা হয়, এবং আমি আগেই বলেছি যে অ্যারের স্ট্রিং উপস্থাপনাটি একটি খালি স্ট্রিং, এবং আপনি যখন খালি স্ট্রিংটিকে সংখ্যায় রূপান্তর করেন তখন এটি শূন্যে রূপান্তরিত হয়:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
তাই আমরা কিছু পদক্ষেপে অভিব্যক্তিটিকে "ডিকোড" করতে পারি:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
দ্রষ্টব্য যে স্ট্রিং মানগুলিতে বন্ধনী সংকেত ব্যবহার করে অক্ষর অ্যাক্সেস করা ECMAScript 3 য় অংশ ছিল না। সংস্করণ নির্দিষ্টকরণ, (যে কারণে charAtপদ্ধতিটি বিদ্যমান ছিল)।
তবে এই জাতীয় "সূচক বৈশিষ্ট্য" যা স্ট্রিংয়ের চরিত্রগুলিকে প্রতিনিধিত্ব করে তা ECMAScript 5 তে মানক করা হয়েছিল, এবং মানককরণের আগেও বৈশিষ্ট্যটি বেশ ভাল সংখ্যক ব্রাউজারে উপলব্ধ ছিল (এমনকি আইই 8 (মানক মোডে))।