(! [[] + []) [+ []]… এটি কেন কাজ করে তা ব্যাখ্যা করুন


107
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);

এই কোড আউটপুট হল: fail। কেন?

উপায় দ্বারা, (![]+[])[+!+[]] == 'false'[1]ডান ?. তবে কেন ![]+[] == "false"এবং কেন +!+[] == 1?


14
@ স্নুব আমি আপনাকে বিশ্বাস করি না শেষ পর্যন্ত, এটি একটি কাঁটাচামচ বোমা।
জোহানেস স্কাউব -

3
এটি অবশ্যই একটি স্ট্রিং আক্ষরিক,);
ই জিয়াং

3
(![]+[])[+[]]"F" (প্রথম "FALSE" থেকে গৃহস্থালির কাজ), হয় (![]+[])[+!+[]]হয় "একটি", ইত্যাদি
মরিসিও শেফার

3
@ স্নুব: যেমন আপনি বলেছেন, আপনি আপনার ব্রাউজারে প্রতিটি অভিব্যক্তি পরীক্ষা করতে পারেন। alert(![]+[])তারপর চেষ্টা করুন alert(+!+[])এবং আপনি দেখতে পাবেন।
মৌরিসিও শেফার

12
অকেজো বা না, আমি এটি একটি আকর্ষণীয় প্রশ্ন মনে করি এবং একটি ভাল শব্দযুক্ত ব্যাখ্যা দেখতে চাই। দরকারীতা বা ব্যবহারিকতা বিবেচনা করা হলে অনেক কোড গল্ফ বন্ধ হয়ে যাবে। মন এবং চিন্তার প্রক্রিয়াটি প্রসারিত করার জন্য এক্সেসরিজ এবং গেমগুলি নিজের মধ্যে এবং সেগুলির জন্য দরকারী।
জন কে

উত্তর:


127

যেহেতু @ মৌরিসিও মন্তব্য করেছেন (![]+[])[+[]]"চ" ("ভুয়া" এর প্রথম চর), (![]+[])[+!+[]])এটি "এ", ইত্যাদি ...

এটা কিভাবে কাজ করে?

আসুন প্রথম চরিত্রটি পরীক্ষা করি, 'চ':

(![]+[])[+[]]; // '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 (মানক মোডে))।


46
শুধু আশা করি এটি কোনও সাক্ষাত্কারের প্রশ্ন নয়।
ইনিশির

4
@JTA: আমি আশা করি এটা হয় ! আমি পাস করেছি :
মরিসিও শেফার

18
"আমি" কোথা থেকে আসে?
জোশ স্টোডোলা

5
@ রিলেমন, intভাষার কোনও ডেটা টাইপ নেই , আসলে সমস্ত সংখ্যার ডাবল-স্পষ্টতা ision৪- বিট ফর্ম্যাট (আইইইই E৫৪ মান), যদিও কিছু অপারেটর অভ্যন্তরীণভাবে পূর্ণসংখ্যার মানগুলির সাথে কাজ করে (বিটওয়াইস অপারেটরের মতো) ফলাফল সর্বদা দ্বিগুণ হয় । 'i'থেকে এই উদাহরণে আসে undefined, কিন্তু এটা থেকে আসতে পারে Infinityউদাহরণস্বরূপ: (+!+[]/+[+[]]+[])[!+[]+!+[]+!+[]]=> (1/0+'')[3]=> (Infinity+'')[3]=>'i'
, CMS

5
@ জোস্টস্টোডোলা ভাল, 3 মাস পরে, আরও একটি ব্যাখ্যা। এই ক্ষেত্রে "আমি" হ'ল "অপরিজ্ঞাত" থেকে এসেছে, তবে এখানে আরও একটি কৌশল জড়িত রয়েছে। কোডটি "মিথ্যা "টিকে" অপরিজ্ঞাপিত "গঠনের সাথে সংযুক্ত করে "falseundefined"(ব্যবহার করে নির্মিত হয় [![]]+[][[]]) যা" i "এর সূচক 10 +!+[]+[+[]]দেয় "10"। এটি "আমি" নিষ্কাশন করতে ব্যবহৃত হয় (স্ট্রিং সূচকগুলি জাভাস্ক্রিপ্টে ব্যবহার করা যেতে পারে যদি তারা দৃশ্যত পূর্ণসংখ্যার দিকে জোর করা যায়)। চূড়ান্ত কনস্ট্রাক্ট যা উত্পাদন করে হল:([![]]+[][[]])[+!+[]+[+[]]]
এনট্রপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.